ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

事务概念

2022-02-25 22:33:32  阅读:164  来源: 互联网

标签:事务 幻读 try 概念 脏读 版本 数据



脏写/空回滚/业务悬挂/隔离级别/脏读/(不)可重复读/幻读/多版本并发控制(MVCC)/next-key锁

~脏写
多线程并发访问AT模式的分布式事务时,事务a事务协调者(TC)在通知结果之前(提交or回滚),事务b对数据进行了操作,事务a根据快照恢复数据,就会丢失一次操作;
全局锁解决;

~空回滚
TCC模式的分布式事务中,
某事务分支try阶段阻塞导致全局事务超时而触发cancel操作,在未执行try操作的情况下执行了cancel,此时不能回滚,即空回滚;
判断try是否已经执行;

~业务悬挂
TCC模式的分布式事务中,空回滚之后,try操作恢复,永远不会执行confirm或cancel
事务一直处于中间状态,即业务悬挂;
记录事务状态解决;

~事务的隔离级别
读未提交:
所有事务都能读到其他事务未提交的数据,产生脏读问题;

  ~脏读:事务a修改数据未提交,事务b读取,事务a再次修改或者撤销修改,则事务b读取的是无效数据;

读已提交:
一个事务只能看见其他事务已提交的数据,避免了脏读,随之而来不可重复读,幻读;

  ~不可重复读:同一事务的两次读操作间其他事物修改了数据,导致两次读取数据不一致;

  ~幻读:事务b以插入或删除操作修改事务a的结果集;

可重复读:
确保一个事务中多个实例并发读取数据时有相同结果;
幻读问题仍然存在;

可串行化:
强制事务排序,数据行上加共享锁;
可解决幻读,但性能低;

那么;
幻读问题怎么有效解决?
~多版本并发控制(MVCC)快照读 select
 InnoDB为例,每行加冗余字段(创建版本和过期版本),版本号随每次事务的开启自增;
事务每次取数据取创建版本小于当前事务版本和过期版本大于当前事务版本的数据;
原理:快照历史数据,其他事务操作对当前事务不可见;

~next-key锁(当前读)
包含行锁和间隙锁两部分;
行锁加在索引,间隙锁加在索引之间;
原理:将当前数据行与上一条数据和下一条数据之间的间隙锁定,保证此范围内读取的数据是一致的;

MySQL InnoDB引擎RR(可重复读)隔离级别是否解决了幻读?

标签:事务,幻读,try,概念,脏读,版本,数据
来源: https://www.cnblogs.com/peachblossom/p/15938028.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有