MySQL事务隔离级别的实现原理

知识储备

只有InnoDB支持事务,所以这里说的事务隔离级别是指InnoDB下的事务隔离级别

隔离级别

读未提交:一个事务可以读取到另一个事务未提交的修改。这会带来脏读,幻读,不可重复读问题

读已提交:一个事务只能读取另一个事务已经提交的修改。其避免了脏读,仍然存在不可以重复读和幻读问题

可重复读:同一个事务中多次读取相同的数据返回的结果是一样的。其避免了脏读和不可重复读问题,但是幻读依然存在

串行化:事务串行之行。避免了以上所有问题

以上是SQL-92标准中定义的四种隔离级别。在MySQL中,默认的隔离级别是REPEATABLE-READ(可重复读),并且解决了幻读问题。

不可重复读重点在于Update和delete,而幻读的重点在于insert

MVCC

MVCC的全称是多版本并发控制。MVCC使得InnoDB的事务隔离级别下执行一致性读操作有了保证。简单说就是为了查询一些正在被另一个事务更新的行,并且可以看到它们被更新之前的值。这是一个用来增强并发性的强大技术,可以使得查询不用等待另一个事务释放锁。

MVCC会给每一行增加三个字段。分别是DB-TRX-ID DB-ROLL-PTR,DB-ROW-ID

增删查改

在InnoDB中,给每行增加两个隐藏字段来实现MVCC,一个用来记录数据行的创建时间,另一个用来记录行的过期时间,在实际操作中,存储的并不是时间,而是事务版本号,每开启一个新事务,事务的版本号就会递增。所以增删改查中对版本号的作用如下:

select:

读取创建版本小于或等于当前事务版本号,并且删除版本为空或大于当前事务版本的记录。这样可以保证在读取之前记录都是存在的

insert:

将当前事务的版本号保存至行的创建版本号

update

新插入一行,并以当前事务版本号作为新行的创建版本号,同时将原记录行的删除版本号设置为当前事务版本号

delete

将当前事务版本号保存至行的删除版本号

快照读和当前读

快照读:读取的是快照版本,也就是历史版本

当前读:读取的是最新版版

普通的select就是快照读,而update,delete,insert,select...LOCK In SHARE MODE,SELECT...for update就是当前读

一致性非锁定读和锁定读

锁定读

在一个事务中,标准的SELECT语句是不会加锁,但是有两种情况例外。SELECT ... LOCK IN SHARE MODE 和 SELECT ... FOR UPDATE。

SELECT ... LOCK IN SHARE MODE:给记录假设共享锁,这样其他事务职能读不能修改,直到当前事务提交

SELECT ... FOR UPDATE:给索引记录加锁,这种情况跟UPDATE的加锁情况是一样的

一致性非锁定读

consistent read(一致性读),InnoDB用多版本来提供查询数据库在某个时间点的快照。如果隔离级别是REPEATABLE READ,那么在同一个事务中的所有一致性读都读的是事务中第一个的读读到的快照;如果是READ COMMITTED,那么一个事务中的每一个一致性读都会读到它自己刷新的快照版本。Consistent read(一致性读)是READ COMMITTED和REPEATABLE READ隔离级别下普通SELECT语句默认的模式。一致性读不会给它锁访问的表加任何形式的锁,因此其他事务可以同时并发的修改它们

Record Locks(记录锁):在索引记录上加锁

Gap Locks(间隙锁):在索引记录之间加锁,或者在第一个索引记录之前加锁,或者在最后一个索引记录之后加锁

Next-Key Locks:在索引记录上加锁,并且在索引记录之前的间隙加锁。相当于Record Locks与Gap Locks的一个结合

假如一个索引包含以下几个值:10,11,13,20.那么这个索引的next-key锁将会覆盖以下区间:

(negative infinity, 10]

(10, 11]

(11, 13]

(13, 20]

(20, positive infinity)

理论分析

在默认的隔离级别中,普通的SELECT用的是一致性读不加锁。而对于锁定读,UPDATE和DELETE,则需要加锁,至于加什么锁是有不同情况的。如果对一个唯一索引使用了唯一的检索条件,那么只需要锁定相应的索引记录就好;如果是没有使用唯一索引作为检索条件,或者用到了索引范围扫描,那么将会使用间隙锁或者next-key锁来以此阻塞其他会话向这个范围内的间隙插入数据

利用MVCC实现一致性非锁定读,保证在同一个事务中多次读取相同的数据返回的结果是一样的,解决了不可重复读问题

利用Gap Locks和Next-key可以阻止其他事务在锁定区间内插入数据,解决了幻读问题

综上所述,MySQL的默认隔离级别的实现依赖于MVCC和锁,准确点说就是一致性读和锁

https://www.cnblogs.com/develop-SZT/p/10339138.html

java mysql实现原理_MySQL事务实现原理相关推荐

  1. mysql mmvc_深入了解事务的原理

    首页 专栏 java 文章详情 0 深入了解事务的原理 rookie_only 发布于 1 月 21 日 1.事务基础概念 1.1.什么是事务 引用百度百科上的一段话: 事务(Transaction) ...

  2. mysql 并发性_MySQL 事务

    1.什么是事务,为什么需要事务 事务(Transaction)是数据库并发控制的不可分割的基本单位,可以将一系列的数据库操作集合到一个事务中,从总体上来讲这个事务可能会对数据库进行一些变动.事务存在的 ...

  3. mysql ib_logfile 数量_Mysql 事务日志(Ib_logfile)

    mysql的innodb中事务日志ib_logfile(0/1) 概念: 事务日志或称redo日志,在mysql中默认以ib_logfile0,ib_logfile1名称存在,可以手工修改参数,调节开 ...

  4. mysql+nest+嵌套事务_MySQL——事务

    事务(Transaction)是数据库区别于文件系统的重要特性之一,事务会把数据库从一种一致状态转换为另一种一致状态. 关键词事务四大特性ACID MySql事务隔离级别 MVCC多版本并发控制实现方 ...

  5. mysql 开启事物_mysql事务的开启

    mysql事务的开启 对于一个MYSQL数据库(InnoDB),事务的开启与提交模式无非下面这两种情况: 1>若参数autocommit=0,事务则在用户本次对数据进行操作时自动开启,在用户执行 ...

  6. mysql show 原理_mysql事务的实现原理

    此篇文章算是对mysql事务的一个总结,基本把mysql事务相关的知识点都涵盖到了,面试问来问去无非也就是这些,在了解这些之前我们先对mysql在执行的过程中  有一个整体的认识,如下图 如上图所示, ...

  7. Mysql drop table 原理_mysql事务的实现原理

    此篇文章算是对mysql事务的一个总结,基本把mysql事务相关的知识点都涵盖到了,面试问来问去无非也就是这些,在了解这些之前我们先对mysql在执行的过程中 有一个整体的认识,如下图 如上图所示,M ...

  8. mysql 事务隔离级别实现原理_MySQL事务隔离级别和实现原理 - 米扑博客

    开发中经常提到数据库的事务,那你知道数据库还有事务隔离的说法吗, 事务隔离还有隔离级别,那什么是事务隔离,隔离级别又是什么呢? MySQL 事务 本文所说的 MySQL 事务都是指在 InnoDB 引 ...

  9. mysql 事务 回滚 原理_mysql 事务的实现原理

    一. 开篇 相信大家都用过事务以及了解他的特点,如原子性(Atomicity),一致性(Consistency),隔离型(Isolation)以及持久性(Durability)等.今天想跟大家一起研究 ...

最新文章

  1. 前谷歌高管给初入职场新人的14条忠告
  2. 安装wamp时出现httpd.exe无法找到组件MSVCR100.dll的解决办法
  3. IBatis常见错误集锦
  4. CompressAI:InterDigital开源基于学习的图像视频压缩研究库
  5. 【云速建站】SSL证书自助部署
  6. UVALive4983 UVa1593 POJ3959 Alignment of Code【字符串流+输入输出】
  7. python中shift_Pandas DataFrame.shift()用法示例
  8. Java设计模式学习总结(6)——创建型模式之原型模式
  9. sublime多行变一行及sublime一键格式化html/css/js、光标快捷键移动行首行尾、删除空行
  10. poj 1466 Girls and Boys
  11. 24.go clean
  12. router单页面多个标签tags的用法router-view/router-view
  13. ZEMAX | 如何对中间面进行优化
  14. 计算机涨跌公式,计算机今日涨跌公式,怎么算 股票的涨跌停板 公式是怎么的?...
  15. 记录: 问题:/usr/bin/ld: main.o: Relocations in generic ELF (EM: 183)
  16. 房间类游戏后台框架(一)—介绍
  17. MACD指标在外汇交易中的另类运用方法
  18. 行思工作室官网移动端前端开发笔记
  19. 高斯列主元消去法——C实现
  20. RxJava从入门到精通:RxJava源码初步分析

热门文章

  1. 实践:创建异步 HTTP 处理器
  2. fastJson性能测试
  3. TensorFlow 分布式
  4. android 代码写命令,monkey基本命令及脚本编写(示例代码)
  5. matlab var std,Matlab var std cov 函数解析
  6. 【python】Get与Post的区别?(面试官最想听到的答案)
  7. c#中bin,obj,properties文件夹的作用
  8. magenta内核与linux,谷歌将推出新操作系统Fuchsia:Magenta语言为内核
  9. assert和if的使用
  10. android gb2312 utf-8,不同编码页面之间用form传值出现乱码问题解决方案 utf-8 到 gb2312...