目录
事务概念
事务特性(ACID)
原子性(Atomicity)
一致性(Consistent)
隔离性(Isolation)
持久性(Durability)
undo / redo 机制
事务不考虑隔离性的一些问题
脏读
不可重复读
幻读
事务隔离级别
读未提交(READ UNCOMMITTED)
读已提交(READ COMMITTED)
可重复读(REPEATABLE READ)
串行(SERIALIZABLE)
事务概念
事务是指对数据库的一批操作,要么都执行成功,要么都执行失败。
例如转账,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又回滚了。
不可重复读
同样条件,两次读取值不一样
幻读
同样条件,两次读取记录数不一样
事务隔离级别
读未提交(READ UNCOMMITTED)
未加任何锁,以上问题都可产生。
读已提交(READ COMMITTED)
可避免脏读
可重复读(REPEATABLE READ)
可避免脏读、不可重复读
串行(SERIALIZABLE)
可避免脏读、不可重复读、幻读