可重复读实现
2020-05-16 本文已影响0人
HannahLi_9f1c
事务和事务的特性
事务指的就是一系列原子性的操作,这些操作要么全做,要么全都不做。事务是由引擎层支持的,而MylSAM不支持事务,InnoDB支持事务。
- 原子性
- 一致性
- 隔离性
- 持久性
事务的隔离性
事务的隔离性是指事务之间互不干扰,相互隔离。Mysql有四种隔离级别,分别是未提交读,提交读,可重复读和串行化。
- 未提交读:一个事务可以看到其他事务未提交的变更。这种隔离性是最低的,一般不会采用这种隔离级别。未提交读可能会导致脏读、不可重复读和幻读。
- 脏读就是会提交其他事务未提交的脏数据。
- 不可重复读是指一个事务里面多次读取到的结果不一样。不可重复读是由更新造成的。- 幻读是由于其他事务新增数据,导致这个事务读取到的行数不一样。
- 提交读:一个事务读取到其他事务已经提交的变更。提交读可能会导致不可重复读和幻读。
- 可重复读:事务在启动时看到的数据,和在执行过程中看到的是一致的,不会被更改。但是有可能会读到其他事务新增的数据,也就是可能会导致幻读。
- 串行化:这种隔离级别下,“写”加“写”锁,“读”加“读”锁,出现读写冲突时,其他事务需要等待前一个事务执行完成。这种隔离级别下,并发度较低。
事务隔离级别实现
在Mysql中,事务更新时,会记录回滚操作。下图就是将1改成2,2改成3,3改成4对应的回滚记录。
image.png
同一条记录存在不同版本,这就是MVVC,一个事务可以通过回滚操作得到该事务想要的版本
回滚记录什么时候删除?
当系统中没有比当前回滚更早的read-view时,回滚日志会被删除,因此最好不要用长事务,因为会导致大量回滚日志无法删除,占用大量空间。
事务启动方式
set autocommit=1是显示启动事务的方式,启动事务时用begin /start transaction,提交是commit,回滚用rollback。如果设置为set autocommit=0,那么执行select时会创建事务,而且如果是长连接,事务没有提交则不会自动提交,造成长事务。所以最好使用set autocommit =1。使用commit work and chain可以再下一次事务自动开启。