为什么MySQL在innodb引擎中即使使用了MVCC机制仍然会出现丢失更新?
一、为什么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
相关推荐HOT
更多>>MySQL普通索引不等于为什么会失效?
一、MySQL普通索引不等于会失效的原因1、列数据类型不匹配如果查询条件中的列类型与索引列类型不匹配,MySQL无法使用索引进行优化。例如,索引...详情>>
2023-10-18 11:14:01为什么关系型数据库系统不易于scaling out(横向扩展)?
一、为什么关系型数据库系统不易于scaling out(横向扩展)因为传统的SQL数据库没想到要分片存储,而现在的NewSQL开始考虑到这些问题了。当然分...详情>>
2023-10-18 10:49:50MySQL InnoDB引擎中的各种锁具体是怎么实现的?
一、MySQL InnoDB引擎中的各种锁的实现方式MySQL InnoDB引擎中的各种锁是通过多种机制实现的1、共享锁(Shared Lock)和排他锁(Exclusive Lock...详情>>
2023-10-18 10:26:59Android怎么连接远程数据库?
一、Android连接远程数据库的方法1、确保远程数据库可以远程访问首先,确保您的远程数据库允许远程连接。这通常需要在数据库服务器的配置中启用...详情>>
2023-10-18 10:09:10热门推荐
常用JS前端开发框架有哪些?
沸事务并发控制s2pl和s2pl有何区别?
热为什么一台电脑可以安装多个SQL Server实例?
热MySQL普通索引不等于为什么会失效?
新为什么关系型数据库系统不易于scaling out(横向扩展)?
MySQL InnoDB引擎中的各种锁具体是怎么实现的?
Android怎么连接远程数据库?
为什么MySQL在innodb引擎中即使使用了MVCC机制仍然会出现丢失更新?
IO多路复用中select、poll、epoll之间的区别?
读写分离为什么能够提升性能?
为什么mysql innodDB中组合索引中范围查询后的条件索引会失效?
为什么noteexpress不能建立数据库也不能打开别的数据库?
计算机前端是什么?
APP中集成移动端车牌识别系统都能达到什么效果?