事务的四大特性原子性、一致性、隔离性、持久性,

事务隔离的四大隔离级别:

READ UNCOMMITTED(未提交读),

在 read uncommitted级别,事务中的修改,及时没有提交,对其他事务也都是可见的。事物可以读取未提交的数据,这也被称为脏读,你想如果所有的未提交的数据事物它读取了,性能上是不是会差,所以在实际应用场景中很少应用

READ COMMITTED(提交读),

提交读是大部分数据库的默认隔离级别,mysql却不是,因为它所执行的是 一个数据至未提交事务之前 事务是看不到它的,所有事务都是不相干的没有关联,所有的修改对其他事务是不可见的,这个级别也被称为不可重复读,因为两次执行同样的查询,可能会得到不一样的结果。

REPEATABLE READ(可重复读),

可重读读是mysql的默认事务隔离级别,可重读读不会产生脏读的情况,它保证了,在一个事务中多次读取同样记录的结果是一致的,可重复读在innodb和xtradb 储存引擎中通过多版本并发控制解决看了幻读的问题

SERIALIZABLE(可串行化)

可串行化是最高的隔离级别,它通过强制事务串执行,避免了幻读的问题,简单来说,可串行化会在读取的每一行数据上都加上锁,所以可能导致大量的超时和锁争用的问题,实际应用场景中很少用到,只有在非常需要确保数据一致性而且可以接受没有并发的情况下,才考虑该级别隔离

mysql可重复读和幻读实例

2017年04月29日 22:54:27 CWeeYii 阅读数:12979
 
版权声明:本文为博主原创文章,原博地址。 https://blog.csdn.net/CWeeYii/article/details/70991230

mysql的默认事务级别是:可重复读
其中可重复读是通过mvcc来实现的又叫快照读,在事务中的读操作通过对当前的数据库中记录一个版本,以后的读操作只会读取记录的版本,因此相当于对数据库的数据建立了一个快照数据,因此叫做快照读,其不用对数据库中的数据进行加锁又叫做乐观锁。
同时RR事务级别的mysql通当前读和gap锁来解决幻读,其本质是通过对数据库周边记录进行加悲观锁(读锁(共享锁)和互斥锁(写锁))【gap锁】来解决幻读。

1.什么是幻读问题

RR事务隔离级别号称可以解决幻读的问题(通过当前读加锁来实现)
第一步建表并插入5条记录:

接下来我们看下大部分mysql所说的幻读现象:
事务1(开启事务查询发现没有记录6准备插入):

事务2(开启事务,发现没有记录6插入,并提交事务):

事务1:查询发现没有记录6,现在开始进行插入6:

没有的记录我要插入却告诉已经存在,这就是通常说的幻读。

2.gap锁(当前读)解决幻读问题

mysql说对数据加锁不管共享锁还是互斥锁就能解决幻读的问题
开启一个事务1(加上共享锁解决幻读的情况):

开启事务2(查询发现没有记录8,准备插入)

可以发现事务2被阻塞,不准插入,除非事务1提交。因此在事务1中插入记录8是能够成功的。
事务1插入记录8,最后可以查询出自己插入的数据,但是更新一条不存在的数据是不会查询出来的,最后提交事务:

事务2阻塞的操作会爆重复异常:

因此对一个事务加上悲观锁(共享锁或者互斥锁)是能够保证幻读不会出现的,并且谁先加锁,谁就能够保证check and
insert是成功的。如果你需要每个事务的check and
insert都能成功,那么你不要加共享锁,直接加互斥锁。那么事务会直接阻塞在加锁阶段,就不会出现check and insert 失败的情况。
事务1加上互斥锁

事务2也想加互斥锁,BOOM你只能失败:

3.RR没有解决的幻读

场景:我们知道grap锁能够将右边的记录进行加锁,因此我要统计表记录的数量,我只需要对最大记录加锁就行了
事务1:对最大记录互斥加锁,准备计算表中记录数量。发现数量为8,并且不存在3和4的记录。

事务2:插入缺失记录3和4成功,但是插入id为100的记录被锁住,OK事务2可以提交了。

事务1:在事务1在事务2插入数据后进行查询总量,发现数量还是6,OK很完美

事务1:接下来我发现事务1中没有3和4这条记录,我进行一次无用的更新会发生什么?

OK,最终问题终于出现了,为什么我更新两条不存在的记录,我能够更新成功,并且我再次统计的时候,数量添加了两条?并且我重新读取,发现结果不一样了,不是说可以重复读吗?加锁可以解决幻读吗?
PS:如果一个事务里面插入或者删除会改变记录的数据,这个是合理的不是幻读。更新应该只会修改数据记录,这个也是合理,同样不是幻读,都是可重复读的。但是更新出现新的记录就是一种异常的情况。

高性能mysql 事务笔记的更多相关文章

  1. 高性能MySQL --- 读书笔记(1) - 2016/8/2

    此书不但帮助MySQL初学者提高使用技巧,更为有经验的MySQL DBA指出了开发高性能MySQL应用的途径.全书包括14章,内容覆盖MySQL系统架构.设计应用技巧.SQL语句优化.服务器性能调优. ...

  2. 高性能mysql学习笔记

    此文已由作者朱笑天授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 笔者在工作之余阅读了一下高性能mysql,以下的内容对mysql的介绍以及书中涉及一些概念的总结归纳. 1. ...

  3. 《高性能MySQL》笔记——MySQL建表数据类型的选择

    前段时间看了<高性能MySQL>中的选择优化的数据类型,这里主要是做一下笔记. 首先数据选择有几个简单原则: 更小的通常更好.一般情况下,应该尽量使用可以正确存储数据的最小数据类型.例如只 ...

  4. 高性能MySql学习笔记——锁、事务、隔离级别(转)

    为什么需要锁? 因为数据库要解决并发控制问题.在同一时刻,可能会有多个客户端对Table1.rown进行操作,比如有的在读取该行数据,其他的尝试去删除它.为了保证数据的一致性,数据库就要对这种并发操作 ...

  5. 高性能Mysql学习笔记之事务

    传送门 什么是事务? 事务就是一组原子性的SQL查询,或者说一个独立的工作单元.如果数据库引擎能够成功地对数据库应用该组查询的全部语句,那么就会执行该组查询.如果其中有任何一条语句因为崩溃或其他原因无 ...

  6. 高性能MySQL --- 读书笔记(2) - 2016/8/2

    第1章 MySQL架构 MySQL架构与其他数据库服务器大不相同,这使它能够适应广泛的应用.MySQL足够灵活,能适应高要求架构.例如Web应用,同时还适用于嵌入式应用.数据仓库.内容索引和分发软件. ...

  7. 第13章 MySQL服务器的状态--高性能MySQL学习笔记

    13.1 系统变量 -- 服务器配置变量 MySQL通过SHOW VARIABLES  SQL命令显示许多系统变量. 13.2 状态变量--SHOW STATUS SHOW STATUS 命令会在一个 ...

  8. 《高性能mysql》笔记(第一章,mysql的架构与历史)

    mysql的服务器逻辑架构图如下: 目前工作用的5.5版本,5.5版本开始mysql开始将innoDB作为默认的存储引擎,innoDB的表是基于聚簇索引建立的. mysql的存储引擎锁管理非常重要,在 ...

  9. MySQL事务笔记

    1.结束事务的方法用什么? 2.事务的最终形态是什么? commit 提交 rollback 回滚 3.事务的四大特征? ⑴ 原子性 一个事务是最小的工作单元,事务包含的所有操作要么全部成功,要么全部 ...

随机推荐

  1. 分布式-JOB(XXL-Job)

    为什么使用xxl-job,不使用qz: 缺少补偿机制 不支持集群 不支持路由策略 统计任务执行 平台管理 监控,报警邮箱 幂等性:一次请求和多次请求得到相同的结果,不会因为多次的请求,导致最后的数据不 ...

  2. javaAgent介绍

    JavaAgent(转载) http://www.cnblogs.com/diyunpeng/archive/2011/05/26/2057932.html 一文带你了解Java Agent http ...

  3. 使用摄像头或视频运行 ORB-SLAM2 SLAM14讲 第一次课后作业

    参考:视觉SLAM十四讲(第一章作业) 深蓝上高博的第一讲课后题: 题目:6 * 使用摄像头或视频运行 ORB-SLAM2(3 分,约 1 小时)请注意本题为附加题.了解⼀样东西最快的⽅式是⾃⼰上⼿使 ...

  4. AX2012 ERP “系统慢”调优---跟踪SQL执行,优化代码

    对于用户来说,系统是:慢的,难用的.你看xxx,多好用,多快,多人性化. 对于AX ERP系统也不例外,调优是必须的,调优一般分为几种: 系统性监测针对瓶劲环节提升,如:用户--应用服务器--DB-- ...

  5. 在MyEclipse使用Git新建分支,并上传分支---图文教程

    1.选中项目,右键--->Team--->Switch To--->New Branch: 2.在弹出的窗口中,填写新建的分支名称,如下图 3.当前分支就会变成新建分支“test” ...

  6. java常见报错及解决

    Java常见报错信息: Java 常见异常种类 Java Exception: 1.Error  2.Runtime Exception 运行时异常 3.Exception  4.throw 用户自定 ...

  7. How to setup Tensorflow inception-v3 model on Windows

    There is Inception-v3 model python implementation on GitHub at: https://github.com/tensorflow/models ...

  8. MVC和WebApi的区别:

    1.mvc 和WebApi: 区别: a.MVC是建立网站的一种框架,倾向于返回用户的页面请求:webApi倾向于返回用户数据请求 b.mvc直接继承system.mvc.controller:web ...

  9. html+css+jq随记

    随便写个博客吧,记录一下自己的历程,今天忽然用自己好久不用的jq还做项目,并且从零开始搭建,让自己慌乱不已啊!遇到了如下问题 1.ios端点击闪屏的问题,解决办法如下 在body上添加 -webkit ...

  10. MySql查询问题select from

    一开始这样不行,后来把值用单引号引起来就行了SELECT * FROM reflectmastercore WHERE name=free 就像下面这样 SELECT * FROM reflectma ...