事务隔离级别
前言
一次事务的执行,就是一次状态的转换。事务执行后,必须从一个一致性状态转换到下一个一致性状态,如果事务发生中止,也要回滚到最初的一致性状态。
什么是事务隔离级别
系统通过一些方法,使得并发执行的事务按照一定的顺序单独执行,或者最终执行的效果和单独执行一样。也就是说让事务“隔离”地执行。这就是事务的隔离性。
为了舍弃一部分隔离性来换取一部分性能,设立的不同的级别。隔离级别越低,就越可能发生越严重的问题。
事务并发执行中的一致性问题
- 脏写
一个事务修改了另一个未提交事务修改过的数据。
- 脏读
一个事务读取了另一个未提交事务修改过的数据。
严格意义指的是修改数据的事务发生回滚,使得读取到的数据不能保证一致性。
- 不可重复读
一个事务修改了另一个未提交事务读取的数据。
严格意义指的是一个事务读取一个数据后,这个数据被另一个事务修改,再一次读取这个事务时,两次读取到的值不一致。
- 幻读
一个事务先根据某些搜索条件查询出来一些记录,在该事务未提交时,另一个事务写入了一些符合该搜索条件的记录。
严格意义指的是一个事务先读取服务搜索条件的一些记录,然后另一个事务写入了符合搜索条件的记录,再读取符合搜索条件的记录时,两次读取的记录不一致。
SQL中的隔离级别
- READ UNCOMMITTED:未提交读
- READ COMMITTED:已提交读
- REPEATABLE READ:可重复读
- SERIALIZABLE:可串行化
隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
READ UNCOMMITTED | 可能 | 可能 | 可能 |
READ UNCOMMITTED | 不可能 | 可能 | 可能 |
REPEATABLE READ | 不可能 | 不可能 | 可能 |
SERIALIZABLE | 不可能 | 不可能 | 不可能 |
MySQL的默认隔离级别是REPEATABLE READ。
阅读学习《MySQL是怎样运行的》。