事务带来的问题
- 脏读:当前事务读取到其他事务未提交的数据。
- 不可重复读:事务两次读到的数据不一致。
- 幻读:一个事务读取某个范围内的数据,另一个事务在这个范围内增加了一条数据,先前的事务又读取了该范围,结果读到了新的数据,这个数据就叫幻行。
隔离级别
隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
READ UNCOMMITED(未提交读) | Yes | Yes | Yes |
READ COMMITED(提交读) | No | Yes | Yes |
REPEATABLE READ(可重复读) | No | No | Yes |
SERIALIZABLE(可串行化) | No | No | No |
介绍
READ UNCOMMITED(未提交读)
在这个级别下,事务的修改对其他事务是可见的,不管该事务有没有提交。脏读、不可重复读和幻读都会发生。
READ COMMITED(提交读)
在这个级别下,只读其他事务提交后的数据,但可能两次查询得到不一样的结果,可以解决脏读的问题。
REPEATABLE READ(可重复读)
在这个级别下,满足同一事务多次读取数据一致,只会出现幻读。Mysql
的存储引擎 InnoDB
使用 next key locking
解决幻读的问题。注意这是 Mysql
默认的隔离级别。
SERIALIZABLE(可串行化)
在这个级别下,事务串行执行,它会对所有读到的数据加锁,所以没有任何数据不一致的问题,因此性能也很差。