数据库并行产生的问题

  1. A事务撤销时,将B事务更改的数据撤销。
  2. A事务提交时,将B事务更改的同行数据覆盖。
  3. 脏读:A事务读取到了B事务未提交的数据。
  4. 不可重复读:A事务中同查询语句不幂等,读到已更新数据。
  5. 幻读:A事物中同查询语句不幂等,读到新插入数据。

数据库事务隔离级别

  1. 串行化(Serializable):一个事务执行过程中完全看不到其他事务,但如果其他事务在操作,只能停等;可避免以上五个问题。
  2. 可重复读(Repeated Read, RR):一个事务可以看到其他事务已提交的新插入记录,但不能看到其他事务对已有行的更新记录;允许幻读。
  3. 读已提交数据(Read Committed, RC):一个事务可以看到其他事务已提交的记录,包括插入和更新;允许幻读和不可重复读。
  4. 读未提交(Read Uncommited):一个事务可以看到其他事务未提交的数据;仅能避免A事务撤销影响B事务。

InnoDB中的事务实现

MySQL的引擎是innoDB时,使用的默认隔离级别为,可重复读(RR级);大部分数据库使用的默认隔离级别为读已提交(RC级)。

实现RC级的事务时,仅需要采用行锁。InnoDB的行锁采用乐观锁的形式实现事务,InnoDB在每行数据后加入两个字段:创建版本号,删除版本号,在事务为默认的RR级以及RC级时,InnoDB事务隔离实现如下:

  • select 读取版本号<=当前事务版本号,删除版本号为空或大于当前事务版本号。
  • insert 保存当前事务版本号为行的创建版本号。
  • delete 保存档前事务版本号为行的删除版本号。
  • update 插入一条新的记录,保存当前事务版本号为行的创建版本号,同时保存当前事务版本号到原来的行。

需要注意的是,基于上述原理,mysql事务级别为可重复读时,select操作的结果不会有幻读记录,实际上,这是因为mysql的select是一种“快照读”,而非“当前读”。因此,事务为RR级和RC级时,mysql的select是不需要加锁的,但一旦涉及到insert/update/delete,则需要当前读,就需要加锁。

MySQL事务使用了Next-Key锁,Next-Key锁是行锁和间隙锁的合并。行锁负责给操作行加锁,在RC级中,使用行锁已经足够。而间隙锁,则基于数据作为索引结构的B+树,将数据所在块的邻接块一同加锁,因此可能会锁住不必要的区间,如果不使用索引,则会给全表加锁。

需要注意的是级别是串行的话,即便是select操作也是加锁的。

参考文献

Innodb中的事务隔离级别和锁的关系
数据库事务隔离级别

常见问题:MySQL/事务隔离的更多相关文章

  1. [51CTO]新说MySQL事务隔离级别!

    新说MySQL事务隔离级别! 事务隔离级别这个问题,无论是校招还是社招,面试官都爱问!然而目前网上很多文章,说句实在话啊,我看了后我都怀疑作者弄懂没!本文所讲大部分内容,皆有官网作为佐证,因此对本文内 ...

  2. 查询mysql事务隔离级别

    查询mysql事务隔离级别 查询mysql事务隔离级别 分类: DB2011-11-26 13:12 2517人阅读 评论(0) 收藏 举报 mysqlsessionjava   1.查看当前会话隔离 ...

  3. MySQL事务隔离级别测试实例

    https://www.cnblogs.com/huanongying/p/7021555.html MySQL事务隔离级别 事务隔离级别 脏读 不可重复读 幻读 读未提交(read-uncommit ...

  4. Mysql事务-隔离级别

    MYSQL事务-隔离级别 事务是什么? 事务简言之就是一组SQL执行要么全部成功,要么全部失败.MYSQL的事务在存储引擎层实现. 事务都有ACID特性: 原子性(Atomicity):一个事务必须被 ...

  5. MySQL事务隔离级别 解决并发问题

    MySQL事务隔离级别 1. 脏读: 骗钱的手段, 两个窗口或线程分别调用数据库转账表,转账后未提交,对方查看到账后,rollback,实际钱没转. 演示方法: mysql默认的事务隔离级别为repe ...

  6. mysql事务隔离级别、脏读、幻读

    Mysql事务隔离级别本身很重要,再加上可能是因为各大公司面试必问的缘故,在博客中出现的概率非常高,但不幸的是,中国的技术博客要么是转载,要么是照抄,质量参差不齐,好多结论都是错的,对于心怀好奇之心想 ...

  7. mysql事务隔离级别与设置

    mysql数据库,当且仅当引擎是InnoDB,才支持事务: 1.隔离级别 事务的隔离级别分为:未提交读(read uncommitted).已提交读(read committed).可重复读(repe ...

  8. MySQL事务隔离级别(二)

    搞清楚MySQL事务隔离级别 首先创建一个表 account.创建表的过程略过(由于 InnoDB 存储引擎支持事务,所以将表的存储引擎设置为 InnoDB).表的结构如下: 为了说明问题,我们打开两 ...

  9. MySQL事务隔离级别(一)

    本文实验的测试环境:Windows 10+cmd+MySQL5.6.36+InnoDB 一.事务的基本要素(ACID) 1.原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做 ...

随机推荐

  1. 洛谷 P1102 A-B数对 题解

    P1102 A-B 数对 题目描述 出题是一件痛苦的事情! 题目看多了也有审美疲劳,于是我舍弃了大家所熟悉的 A+B Problem,改用 A-B 了哈哈! 好吧,题目是这样的:给出一串数以及一个数字 ...

  2. BZOJ 1857: [Scoi2010]传送带

    二次联通门 : BZOJ 1857: [Scoi2010]传送带 /* BZOJ 1857: [Scoi2010]传送带 三分套三分 可能是吧..dalao们都说明显是一个单峰函数 可是我证不出来.. ...

  3. LOJ2719. 「NOI2018」冒泡排序 [组合计数]

    LOJ 思路 这题我看着题解还搞了几个小时?我也不知道自己在干啥-- 首先你要通过出色的分析能力得到一个结论:一个排列合法当且仅当它的最长下降子序列长度不超过2. 证明?懒得写了. 然后我们不管字典序 ...

  4. jQuery学习笔记——基本了解

    安装 两种方法: 从 jquery.com 下载jQuery. 从 CDN 中载入 jQuery, 如从我的博客中加载 jQuery: <script src="https://blo ...

  5. Ibatis自动解决sql注入机制

    疑问1:为什么IBatis解决了大部分的sql注入?(实际上还有部分sql语句需要关心sql注入,比如like) 之前写Java web,一直使用IBatis,从来没有考虑过sql注入:最近写php( ...

  6. form表单文件上传提交且接口回调显示提交成功

    前端: <form method="post" enctype="multipart/form-data" id="formSubmit&quo ...

  7. SSM项目启动报错WEB-INF\lib\javax.servlet-api-4.0.1.jar) - jar not loaded. See Servlet Spec 3.0, section 10

    错误信息: validateJarFile(D:\tomcat_ryxunit\webapps\ryx_unit\WEB-INF\lib\javax.servlet.jar) - jar not lo ...

  8. CMD命令打包文件夹成jar

    网上的很多例子都是直接将在dos界面下输入jar命令出现的帮助信息给贴上了.不明白的人根本看不懂.当然我也看不懂,好在自己试了好多遍,终于成功了.现在我就根据我刚刚的操作来说明一下. 我介绍的是将一个 ...

  9. eclipse连接夜神模拟器方法

    用eclipse 进行安卓开发的时候我们会遇到安卓自带的模拟器启动时间过长,反应慢等的问题,这个时候我们就希望使用别的安卓模拟器,而我自己喜欢使用夜神模拟器.1.首先我们启动eclipse 和夜神模拟 ...

  10. Nexus3.X忘记admin密码找回

    一.问题背景 nexus3 这种东西,传完一次,很少动了,很容易忘记密码,不要急有方法找回. 官方网站关于解决该问题的方法: https://support.sonatype.com/hc/en-us ...