千锋教育-做有情怀、有良心、有品质的职业教育机构

400-811-9990
手机站
千锋教育

千锋学习站 | 随时随地免费学

千锋教育

扫一扫进入千锋手机站

领取全套视频
千锋教育

关注千锋学习站小程序
随时随地免费学习课程

上海
  • 北京
  • 郑州
  • 武汉
  • 成都
  • 西安
  • 沈阳
  • 广州
  • 南京
  • 深圳
  • 大连
  • 青岛
  • 杭州
  • 重庆
当前位置:合肥千锋IT培训  >  技术干货  >  为什么MySQL在innodb引擎中即使使用了MVCC机制仍然会出现丢失更新?

为什么MySQL在innodb引擎中即使使用了MVCC机制仍然会出现丢失更新?

来源:千锋教育
发布人:xqq
时间: 2023-10-18 09:47:16

一、为什么MySQL在innodb引擎中即使使用了MVCC机制仍然会出现丢失更新

mvcc在innodb中只负责解决读写冲突,把普通select语句变成快照读。写冲突仍然是靠锁来解决的。因此要解决你说的丢失更新,要用select…for update主动加x锁。

当然mvcc不是说完全不能解决丢失更新,比如postgresql的serializable隔离级别下,遇到写写冲突直接向客户端返回异常,保证只有一个事务可以更新成功。

Mysql在可重复读隔离级别下可保证事务较高的隔离性,同样的sql查询语句在一个事务里多次执行查询结果相同,就算其它事务对数据有修改也不会影响当前事务sql语句的查询结果

  这个隔离性就是靠MVCC(Multi-Version Concurrency Control)机制保证

对一行数据的读和写两个操作默认是不会通过加锁互斥来保证隔离性,避免了频繁加锁互斥而在串行化隔离级别为了保证较高的隔离性是通过将所有操作加锁互斥来实现的

延伸阅读:

二、MVCC多版本并发控制机制的实现

undo日志版本链是指一行数据被多个事务依次修改过后,在每个事务修改完后,Mysql会保留修改前的数据undo回滚日志,并且用两个隐藏字段trx_id和roll_pointer把这些undo日志串联起来形成一个历史记录版本链。

在可重复读隔离级别,当事务开启,执行任何查询sql时会生成当前事务的一致性视图read-view该视图在事务结束之前都不会变化(如果是读已提交隔离级别在每次执行查询sql时都会重新生成)该视图由执行查询时所有未提交事务id数组(数组里最小的id为min_id)和已创建的最大事务id(max_id)组成事务里任何sql的查询结果需要从对应版本链里的最新数据开始逐条跟read-view做比对从而得到最终的快照结果

1.如果 row 的 trx_id 落在绿色部分( trx_id

2. 如果 row 的 trx_id 落在红色部分( trx_id>max_id ),表示这个版本是由将来启动的事务生成的,是不可见的(若 row 的 trx_id 就是当前自己的事务是可见的);

3. 如果 row 的 trx_id 落在黄色部分(min_id <=trx_id<= max_id),那就包括两种情况:

若 row 的 trx_id 在视图数组中,表示这个版本是由还没提交的事务生成的,不可见(若 row 的 trx_id 就是当前自己的事务,是可见的);

若 row 的 trx_id 不在视图数组中,表示这个版本是已经提交了的事务生成的,可见。

声明:本站稿件版权均属千锋教育所有,未经许可不得擅自转载。

猜你喜欢LIKE

常用JS前端开发框架有哪些?

2023-10-18

读写分离为什么能够提升性能?

2023-10-18

为什么noteexpress不能建立数据库也不能打开别的数据库?

2023-10-18

最新文章NEW

为什么mysql innodDB中组合索引中范围查询后的条件索引会失效?

2023-10-18

QQ这种大型数据库是怎么实现数据瞬间查询的?

2023-10-18

网站使用大带宽服务器有什么好处?

2023-10-18

相关推荐HOT

更多>>

快速通道 更多>>

最新开班信息 更多>>

网友热搜 更多>>