美文网首页
可重复读实现

可重复读实现

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

相关文章

  • 可重复读实现

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

  • MySQL的可重复读级别能解决幻读吗

    转载 MySQL的可重复读级别能解决幻读吗MySQL事务隔离级别的实现原理

  • mysql是如何实现可重复读的?

    一个事务要更新一行,如果刚好有另外一个事务拥有这一行的行锁,会被锁住,进入等待状态。既然进入了等待状态,那么等到这...

  • MySQL是如何实现可重复读的?

    Photo by picography.co 《MySQL实战45讲》笔记。 简单理解一下可重复读 可重复读是指:...

  • 讲明白MySQL的MVCC

    mvcc 多版本并发控制 MVCC 只会在可重复读和读提交两个隔离级别下实现。 主要实现是 快照读(read vi...

  • mvcc探讨

    1.mvcc是什么? 多版本并发控制,是MySQL的innoDB引擎实现隔离级别的一种方式,用来实现可重复读和读已...

  • 笔试题分析(一)

    1、合并两个列表并加以排序和去重 思路:去重可借助集合或循环实现,排序利用list.sort实现 2、n的阶层实现...

  • Mysql 可重复读

    事务隔离级别 RR 可重复读 在RC 已提交读 级别下,同一事务中: 当我们使用读语句时: 确定扫描行 多次读取都...

  • 数据库系列6-事务和锁

    MySQL利用MVCC(MVCC又是依据undo log实现的),在一个可重复读的事务执行过程中,读取到的数据都是...

  • 3 .事务隔离

    实现方法: 可重复读 : 数据库里在事务启动时创建一个__视图__read-view,整个事务存在期间读取数据都用...

网友评论

      本文标题:可重复读实现

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