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
就好了。
InnoDB事务篇的更多相关文章
- MySQL · 引擎特性 · InnoDB 事务锁简介
https://yq.aliyun.com/articles/4270# zhaiwx_yinfeng 2016-02-02 19:00:43 浏览2194 评论0 mysql innodb lock ...
- MySQL · 引擎特性 · InnoDB 事务子系统介绍
http://mysql.taobao.org/monthly/2015/12/01/ 前言 在前面几期关于 InnoDB Redo 和 Undo 实现的铺垫后,本节我们从上层的角度来阐述 InnoD ...
- MySQL · 引擎特性 · InnoDB 事务系统
前言 关系型数据库的事务机制因其有原子性,一致性等优秀特性深受开发者喜爱,类似的思想已经被应用到很多其他系统上,例如文件系统等.本文主要介绍InnoDB事务子系统,主要包括,事务的启动,事务的提交,事 ...
- mysql存储过程之事务篇
mysql存储过程之事务篇 事务的四大特征: ACID:Atomic(原子性).Consistent(一致性).Isolated(独立性).Durable (持久性) MySQL的事务支持不是绑定在M ...
- Mysql优化(出自官方文档) - 第十篇(优化InnoDB表篇)
Mysql优化(出自官方文档) - 第十篇(优化InnoDB表篇) 目录 Mysql优化(出自官方文档) - 第十篇(优化InnoDB表篇) 1 Optimizing Storage Layout f ...
- innodb事务日志详解
首先看InnoDB的缓存和文件的关系图如下: InnoDB事务日志功能介绍 InnoDB使用日志来减少提交事务时的开销.因为日志中已经记录了事务,就无须在每个事务提交时把缓冲池的脏块刷新(flush) ...
- 搞懂MySQL InnoDB事务ACID实现原理
前言 说到数据库事务,想到的就是要么都做修改,要么都不做.或者是ACID的概念.其实事务的本质就是锁和并发和重做日志的结合体.那么,这一篇主要讲一下InnoDB中的事务到底是如何实现ACID的. 原子 ...
- 一文快速搞懂MySQL InnoDB事务ACID实现原理(转)
这一篇主要讲一下 InnoDB 中的事务到底是如何实现 ACID 的: 原子性(atomicity) 一致性(consistency) 隔离性(isolation) 持久性(durability) 隔 ...
- MySql - InnoDB - 事务 , Php版
(出处:http://www.cnblogs.com/linguanh/) 1,前序 由于要重构APP(社交类) 服务端接口的部分代码,故接触到了 innoDB,以及事务这个词,下面主要是以例子的形式 ...
随机推荐
- MySQL中的 ”SELECT FOR UPDATE“ 一次实践
背景 最近工作中遇到一个问题,两个不同的线程会对数据库里的一条数据做修改,如果不加锁的话,会得到错误的结果. 就用了MySQL中for update 这种方式来实现 本文主要测试主键.唯一索引和普通索 ...
- Spark内核-内存管理
Spark 集群会启动 Driver 和 Executor 两种 JVM 进程 我们只关注Executor的内存. 分为堆内内存和堆外内存 内存分为 存储内存 : 存储数据用的. 执行内存: 执行sh ...
- SpringBoot从入门到精通教程(四)
前端时间整合SSM ,发现了一个现象,在整合的时候 配置文件过于复杂. 1.建工程,建目录,导入jar包. 2.配置 数据源 映射信息 等等 ... 3. 还有 各种 拦截器,控制器 ,头都大了... ...
- 【Tomcat】Tomcat原理与系统架构
目录 版本: 一,目录说明 二,浏览器访问服务器的流程 三,Tomcat系统总体架构 3.1 Tomcat请求的大致流程 3.2 Servlet容器处理请求流程 3.3 Tomcat系统总体架构 四, ...
- Ext CheckBoxGroup使用
一.效果图展示 我这里主要是为了实现选择周期时间.如周一.周二.周三等 二.界面界面代码 下面就是我实现的代码,包含了界面.数据处理.回填数据等.可能架构的方式,您的代码和我的代码有差异,但是大体就是 ...
- spring的事物传递
Propagation.REQUIRED:默认也是常用的事物级别,在当前事物中执行,不存在事物,则创建新事物执行. Propagation.SUPPORTS:支持使用当前事物,当前事物不存爱,则不使用 ...
- java 反射随记
记录一下有关 Class 对象的相关方法: 1.获取 Class 对象的三个方法: ⑴ 使用 Class.forName("全限定类名") ,参数是该类的全限定类名,可拓展性强: ...
- docker 安装 运行 卸载
一.卸载docker 安装时使用什么工具安装的docker就用什么工具卸载docker: 1.yum卸载docker 查看已安装的docker yum list installed | grep do ...
- canvas--总结二
canvas图形绘制 矩形绘制 rect(x,y,w,h) 没有独立路径 strokeRect(x,y,w,h) 有独立路径,不影响别的绘制 fillRect(x,y,w,h) 有独立路径,不影响别 ...
- webservcie学习之webservice是什么
之前写代码,只是用到的时候才去看相关技术,用过后也没有再回头特别 去看,现在突然发现对一些技术的了解不够深刻,故现在准备再从头对用到的技术深入的学习下.就从webservice开始.首先对我不解的地方 ...