MySql的两种存储引擎:InnoDB,MyISAM
InnoDB | MyISAM | |
事务 | 支持ACID的事务,四种事务级别 | 不支持事务,但是每次查询都是原子的 |
锁 | 支持表锁,默认行锁 | 表锁 |
是否存储总行数 | 不存储表的总行数 | 存储表的总行数 |
索引 | 采用聚集索引 | 采用非聚集索引 |
表存储 | 一个Innodb表存储在一个文件内,也可能为多个 | 索引文件、表结构文件、数据文件 |
备注:nnoDB在不使用索引项查询时,也是锁整张表
数据库锁的划分:
- 按粒度划分:表级锁、行级锁、页级锁
- 按锁级别:共享锁(read)、排他锁(write)
- 按加锁方式:自动锁、显示锁
- 按操作划分:DML锁、DDL锁
- 按使用方式:悲观锁、乐观锁
并发事务引发的问题:
1.更新丢失(A事务回滚造成了B事务的更新无效)
解决的级别:InnoDB所有级别都解决了这个问题 ,数据库最低级别Read-Uncommitted
2.脏读(B事务读到了A事务的未提交的更新数据)
解决的级别:Read-Committed 解决了这个问题,使B事务读取的是A事务的已提交数据
3.不可重复读(A事务在B事务多次读取数据过程中,更改提交了数据,导致B事务两次读取的数据不一致)
解决的级别:Repeatable-Read,使B事务忽略A事务对数据的修改提交,读取的是B事务开启时的那份数据(快照)。 但是,仅限于读取,最终修改的数据还是基于A事务提交的数据进行修改(当前读 )。
4.幻读(A事务读取到3条数据后,B事务增加(或删除)1条数据并提交,导致A事务再修改时数据增加了一条之前并没有查询到的数据)
解决的级别:Serializable,使事务之间必须串行执行。Serializable为数据库最高隔离级别。
事务传播属性:
- PROPAGATION_REQUIRED -- 支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。
- PROPAGATION_REQUIRES_NEW -- 新建事务,如果当前存在事务,把当前事务挂起。
- PROPAGATION_SUPPORTS -- 支持当前事务,如果当前没有事务,就以非事务方式执行。
- PROPAGATION_NOT_SUPPORTED -- 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
- PROPAGATION_MANDATORY -- 支持当前事务,如果当前没有事务,就抛出异常。
- PROPAGATION_NEVER -- 以非事务方式执行,如果当前存在事务,则抛出异常。
- PROPAGATION_NESTED--如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则进行与PROPAGATION_REQUIRED类似的操作。