Mysql四种事务隔离级别实现
原子性实现
事务是并发控制的最小单位,如果无法保证原子性,就无法保证一个事务的所有操作都被执行完成。原子性是通过
事务回滚
机制保证,undo log实现了事务回滚
在执行update/delete/insert跟更新操作时,会对应生成update/insert/delete相反的更新undo log日志,在部分事务执行失败的时候,使用undo log日志将已经执行的更新操作回滚,保证了事务的原子性。
持久性实现
持久性是指已经更新的操作会被记录在磁盘上,即使机器宕机,更新结果依然不会丢失
redo log主要用于机器宕机数据恢复,回复过程由mysql自动执行,bin log可以基于某个时间点对数据进行恢复,同时,bin log也用于主从复制。
隔离性
隔离性主要是指两个事务并行执行,彼此之间相互干扰。最高级别的隔离是串行化。锁+MVCC(读快照)是实现事务隔离级。
写-写操作:锁
写-读操作:MVCC(脏读、不可重复读幻读)
锁的概况
select * from information_schema.innodb_locks;
InnoDB整体状态,其中包括锁的情况
show engine innodb status;
在事务A中执行:
start transaction;
update account SET balance = 1000 where id = 1;
#在事务B中执行:
start transaction;
update account SET balance = 2000 where id = 1;
- 脏读:读了别人没有提交的数据。
- 不可重复读:指读取同一条数据,前后数据不一致,由update引起。
- 幻读:读取一个范围内的数据,读取的数量不一致,由insert/update组成。
一致性
原子性、持久性和隔离性合起来共同保证了一致性,也是事务要达到的目标,修改之间满足各种约束的,修改之后也依然满足各种约束,业务上从一个A账户转账到B账户,最终应该保证A扣除金额和B增加金额相等。
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: