美文网首页
可重复读实现

可重复读实现

作者: HannahLi_9f1c | 来源:发表于2020-05-16 23:02 被阅读0次

    事务和事务的特性

    事务指的就是一系列原子性的操作,这些操作要么全做,要么全都不做。事务是由引擎层支持的,而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可以再下一次事务自动开启。

    相关文章

      网友评论

          本文标题:可重复读实现

          本文链接:https://www.haomeiwen.com/subject/cludohtx.html