可重复读实现

2020-05-16  本文已影响0人  HannahLi_9f1c

事务和事务的特性

事务指的就是一系列原子性的操作,这些操作要么全做,要么全都不做。事务是由引擎层支持的,而MylSAM不支持事务,InnoDB支持事务。

  1. 原子性
  2. 一致性
  3. 隔离性
  4. 持久性

事务的隔离性

事务的隔离性是指事务之间互不干扰,相互隔离。Mysql有四种隔离级别,分别是未提交读,提交读,可重复读和串行化。

  1. 未提交读:一个事务可以看到其他事务未提交的变更。这种隔离性是最低的,一般不会采用这种隔离级别。未提交读可能会导致脏读、不可重复读和幻读。
  1. 提交读:一个事务读取到其他事务已经提交的变更。提交读可能会导致不可重复读和幻读。
  2. 可重复读:事务在启动时看到的数据,和在执行过程中看到的是一致的,不会被更改。但是有可能会读到其他事务新增的数据,也就是可能会导致幻读。
  3. 串行化:这种隔离级别下,“写”加“写”锁,“读”加“读”锁,出现读写冲突时,其他事务需要等待前一个事务执行完成。这种隔离级别下,并发度较低。

事务隔离级别实现

在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可以再下一次事务自动开启。

上一篇下一篇

猜你喜欢

热点阅读