MySQL数据库提供了四种事务隔离级别:
- READ_UNCOMMITTED - 未提交读
- READ_COMMITTED - 提交读
- REPEATABLE_READ - 可重复读
- SERIALIZABLE - 串行读
什么是事务
事务指的是满足 ACID 特性的一组操作,可以通过 Commit 提交一个事务,也可以使用 Rollback 进行回滚。
事务的ACID四大特性
原子性(Atomicity)
事务是不可分割最小单元,事务内所有操作要么全部成功提交,要么全部失败回滚。
回滚可以用回滚日志来实现,回滚日志记录着事务所执行的修改操作,在回滚时反向执行这些修改操作即可。
隔离性
一个事务所做的修改在提交以前,对其它事务是不可见的。
一致性
数据库在事务执行前后都保持一致性状态。
在一致性状态下,所有事务对一个数据的读取结果都是相同的。
持久性
事务一旦提交,其所做的修改将会永久保存到数据库中。即使系统发生崩溃,事务执行的结果也不能丢失。
使用重做日志来保证持久性
只有满足一致性,事务的执行结果才是正确的。
在无并发的情况下,事务串行执行,隔离性一定能够满足。此时只要能满足原子性,就一定能满足一致性。
在并发的情况下,多个事务并行执行,事务不仅要满足原子性,还需要满足隔离性,才能满足一致性。
事务满足持久性是为了能应对数据库崩溃的情况。
并发一致性问题
在并发环境下,事务的隔离性很难保证,因此会出现很多并发一致性问题
丢失修改
两个事务 A 和 B 都对一个数据进行修改,A 先修改,B 后修改,B 的修改覆盖了A 的需改
脏读
事务 A 修改了一个数据未提交,事务 B 读取了这个数据,如果事务 A 回滚这次修改,那么事务 B 读到的就是脏数据。
不可重复读
事务 A 读取一个数据,事务 B 修改了这个数据。如果事务 A 再次读取这个数据会导致两次读取结果不一致。
幻读
事务 A 读取某个范围的数据,事务 B 在这个范围内插入一条数据。如果事务 A 再次读取这个范围的数据会导致两次读取结果不一致。
事务隔离级别
未提交读
一个事务所做的修改即使没有提交,对其他事务也是可见的。
提交读
一个事务所做的修改在提交之前对其他事务是不可见的。
可重复读
保证一个事务内多次读取同样数据的结果是一致的。
可串行读
强制事务串行执行。