目录
事务隔离级别
事务概念
事务是指对数据库的一批操作,要么都执行成功,要么都执行失败。
例如转账,A向B转账100块,要么A扣除100,B同时增加100,要么都执行失败,余额都没有变化。
事务特性(ACID)
原子性(Atomicity)
一个事务的操作要么同时成功,要么同时失败。从最终结果来看,这个过程不可分割。这是基于undo log来保证。
一致性(Consistent)
一个事务必须是使数据库从一个一致性状态变到另一个一致性状态,可以理解为数据的一致性。
隔离性(Isolation)
事务之间相互隔离,不受影响。取决于事务设置的隔离级别。
持久性(Durability)
事务一旦提交,对数据的修改是永久性的,数据会持久化到磁盘。基于redo log来保证。
undo / redo 机制
undo log 记录数据数据修改前的信息,保证数据更新失败能够回滚。例如 insert 一条数据, 那undo log会对应记录一条 delete 日志;update 一条数据,undo log记录之前旧值的 update 日志。
redo log 记录数据修改后的信息。修改数据时,MySQL先把这条记录所在的页找到,把该页加载到内存中,然后对其记录进行修改,为了防止内存改完MySQL直接挂掉,redo log用来恢复数据。
事务不考虑隔离性的一些问题
脏读
事务A读到事务B未提交的数据,而事务B又回滚了。
不可重复读
事务A多次读同一数据,事务B同时修改,导致A读到的数据不一致
幻读
同样条件,事务A多次读取,事务B同时新增或删除,导致A读到的记录数不一致
事务隔离级别
隔离级别 | 脏读 | 不可重复读 | 幻读 |
读未提交(READ UNCOMMITTED) | 可能 | 可能 | 可能 |
读已提交(READ COMMITTED) | 不可能 | 可能 | 可能 |
可重复读(REPEATABLE READ)mysql默认 | 不可能 | 不可能 | 可能 |
串行(SERIALIZABLE) | 不可能 | 不可能 | 不可能 |