InnoDB事务篇
1、解决数据更新丢失的问题
1)LBCC:基于锁的并发控制。让操作串行化执行。效率低。
2)MVCC:基于版本的并发控制。使用快照形式。效率高。读写不冲突。主流数据库都是使用的MVCC。
2、InnoDB中MVCC的实现
特点:读不加锁,读写不冲突
实现方案:基于undolog+readview实现的。
1)undolog
回滚日志。需要在undolog中记录未提交操作的原始状态。
在undolog中会记录版本信息。在每一行记录上都有2-3个隐藏列。如果表没有主键时就是3个,如果有主键就是两个。
隐藏列:
rowid:如果没有主键,会自动生成一个隐藏列。
回滚指针:指向记录的上一个版本。
事务id:记录了操作这条记录的事务id。
事务id在mysql中每个事务都有一个唯一的id,并且是自增的。
每次更新时,都是生成一个新的版本,并且由回滚指针指向旧版本。就会形成一个版本链。后台有个purge线程执行清理操作。删除记录时,是在记录上打上删除标记,并不直接删除。
2)readview
生成一个readview相当于生成了一个快照。只要是ReadView不发生变化读到的结果就是相同的。
readview是一个数组,生成的时机是执行select操作时生成。数组m_ids,其中记录的当前时刻,数据库中活跃的事务id列表。
例如:
m_ids:[105,110,111,120]
可见性判断条件:
- 如果被访问版本的trx_id
属性值小于m_ids
列表中最小的事务id,表明生成该版本的事务在生成ReadView
前已经提交,所以该版本可以被当前事务访问。
- 如果被访问版本的trx_id
属性值大于m_ids
列表中最大的事务id,表明生成该版本的事务在生成ReadView
后才生成,所以该版本不可以被当前事务访问。
- 如果被访问版本的trx_id
属性值在m_ids
列表中最大的事务id和最小事务id之间,那就需要判断一下trx_id
属性值是不是在m_ids
列表中,如果在,说明创建ReadView
时生成该版本的事务还是活跃的,该版本不可以被访问;如果不在,说明创建ReadView
时生成该版本的事务已经被提交,该版本可以被访问。
支持两种事务隔离级别:RC、RR。
读未提交和串行化和MVCC没有关系。
一个select对应一个ReadView(m_ids),select语句执行完毕后ReadView就失效。
如果当前数据库中没有活跃事务,那么ReadView(m_ids)中就包含将要生成的事务id。
3)RC事务隔离级别的实现
读已提交,当前事务中可以读取到其他事务提交的结果。
实现方案:在当前事务中执行select查询,就会生成一个ReadView。如果同一个select再次执行,会再次生成ReadView。
4)RR事务隔离级别
可重复读,当前事务中select语句多次执行得到的结果是相同的,无论其他事务是否已经提交。
实现方案:在当前事务中执行select查询,就会生成一个ReadView,之后同一个select使用同一个ReadView。
5)小结:RC和RR的区别
READ COMMITTD
、REPEATABLE READ
这两个隔离级别的一个很大不同就是生成ReadView
的时机不同,READ COMMITTD
在每一次进行普通SELECT
操作前都会生成一个ReadView
,而REPEATABLE READ
只在第一次进行普通SELECT
操作前生成一个ReadView
,之后的查询操作都重复这个ReadView
就好了。
最新文章
- 创建第一个JBPM6项目并且运行自带的helloword例子(JBPM6学习之三)
- webForm练习1(地区导航)
- activiti自定义流程之Spring整合activiti-modeler5.16实例(七):任务列表展示
- codeforces 340B Maximal Area Quadrilateral(叉积)
- Joson的简单用法
- While readingiphone真机无法显示图片,而模拟器可以正常显示
- UIButton上使用UIEdgeInsetsMake让title跟图片对齐
- 团队作业9——测试与发布(Beta版本)(含展示博客)
- IntelliJ配置jenkins服务的Crumb Data
- block,inline,inline-block的区别
- Django中,ajax检测注册用户信息是否可用?
- dll相关总结
- Android-WebView与本地HTML (Java调用--->;HTML的方法)
- Loj 2536 解锁屏幕
- OpenStack Grizzly详细安装指导
- github下载项目
- Spark history Server配置实用
- Windows 10 PC 安装 Docker CE
- 深入浅出 Cocoa 之 Core Data(4)- 使用绑定
- python 基础及资料汇总
热门文章
- s2-061 漏洞复现
- 用Python分析北京市蛋壳公寓租房数据
- 数据库SQL调优的几种方式 EFcore读的情况下使用 AsNoTracking非跟踪查询
- HTTP Error 405.0 - Method Not Allowed 无法显示您正在查找的页面,因为使用了无效方法(HTTP 谓词)。
- spring-boot 使用hibernate validation对参数进行优雅的校验
- Sentinel滑动窗口算法
- pyspark使用-dataframe操作
- 使用Android Studio来阅读Android源码
- CentOS 搭建 SVN 服务器 及使用教程
- 介绍一个新库: Norns.Urd.HttpClient