对于事务的隔离级别,MySQL中默认是RR, Oracle中默认是RC,两个事务隔离级别存在着很大的差别,而换句话说,就算是RR的事务隔离级别级别,同是关系型数据库MySQL,SQLServer,postgreSQL也会有一些差别。所以隔离级别的部分还是值得花一些时间来总结一下。

之前看到过丁奇大师的一篇文章,是分析InnoDB的在隔离级别RR下的一个“诡异”现象。读来受益匪浅,丁大师不光明理而且还能改动代码解决问题,实在佩服,我在自己的环境中也做了一些简单的测试和分析。

首先是初始化基础数据,我们开启两个窗口,创建一个测试表,插入两条记录。

create table t (id int not null, name varchar(10) ) engine=innodb ;
insert into t values(1,'name1'),(3,'name3');
   整个过程虽然是两个窗口,但是操作是一个串行的过程。

首先看下RR本身的现象,会话1开启一个事务,会话2插入一条记录,在会话1中查询应该还是2条数据。

#会话 1
> begin;
Query OK, 0 rows affected (0.00 sec)

开启事务后,查询当前的数据情况。

> select *from t;
+----+-------+
| id | name  |
+----+-------+
|  1 | name1 |
|  3 | name3 |
+----+-------+
2 rows in set (0.00 sec)

会话 2:

会话2插入一条记录,默认提交。
> insert into t values(4,'name4');
Query OK, 1 row affected (0.00 sec)

这个过程中,如果在会话1中查看数据,应该还是2条,这也是RR本身对的含义。
会话 1:
> select *from t;
+----+-------+
| id | name  |
+----+-------+
|  1 | name1 |
|  3 | name3 |
+----+-------+
2 rows in set (0.00 sec)

我们继续做一个update, id=4的记录是刚刚在会话2中插入的,在此处变更,从结果来看还是产生了一行数据的变化,这是一个“诡异”的地方。

> Update t set name= 'name_test' where id = 4;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0
而接下来的地方就是问题的关键了,我们再次查询就输出了3行记录,原来id=4,name='name4'的记录在会话1里面被修改成了id=4,name='name_test'

> select *from t;
+----+-----------+
| id | name      |
+----+-----------+
|  1 | name1     |
|  3 | name3     |
|  4 | name_test |
+----+-----------+
3 rows in set (0.00 sec)

这个时候如果查看会话2的数据情况,得到的结果还是相对合理的。
会话 2:
mysql> select *from t;
+----+-------+
| id | name  |
+----+-------+
|  1 | name1 |
|  3 | name3 |
|  4 | name4 |
+----+-------+
3 rows in set (0.00 sec)

所以这就是更新冲突的策略了,目前的MySQL在RR隔离级别下的实现是这样。而按照我们预期的要求,应该在会话1的事务内是对会话2的变更不可见的。

这一点上,在5.7中的结果也是如此,在5.1的版本中的update的输出效果会有一些差别。

而关于这部分的代码及修改可以参见

http://dinglin.iteye.com/blog/804655

MySQL RR隔离级别的更新冲突策略相关推荐

  1. mysql 中 RC、RR隔离级别的原理及区别

    今天分享 mysql 中 RC.RR隔离级别的原理及区别: 1.首先简介mysql四种隔离级别: 1)未提交读(READ UNCOMMITED)脏读 2) 已提交读 (READ COMMITED)简称 ...

  2. MySQL原理--隔离级别的实现方式--MVCC

    原文网址:MySQL原理--隔离级别的实现方式--MVCC_IT利刃出鞘的博客-CSDN博客 简介 本文介绍MySQL的隔离级别的实现方式--MVCC. 这也是Java后端面试题中常见的一个问题. M ...

  3. MySQL RR隔离级别解决幻读问题?

    首先,讲mysql的隔离级别之前需要复习一下事务的四个特性 (注:mysql存储引擎InnoDB)(待完善) 事务的四个特性(ACID): 原子性(Atomicity) 一致性(Consistency ...

  4. 分布式系统中一些主要的副本更新策略——Dynamo/Cassandra/Riak同时采取了主从式更新的同步+异步类型,以及任意节点更新的策略。...

    分布式系统中一些主要的副本更新策略. 1.同时更新 类型A:没有任何协议,可能出现多个节点执行顺序交叉导致数据不一致情况. 类型B:通过一致性协议唯一确定不同更新操作的执行顺序,从而保证数据一致性 2 ...

  5. mybatisPlus中的field-strategy(字段更新插入策略):null值插入和更新问题

    目录 mybatisPlus中null值插入和更新问题 实际项目解决方法示例一 实际项目解决方法示例二 field-strategy字段更新插入策略介绍 枚举类FieldStrategy源码 枚举类字 ...

  6. mysql插入报主键冲突,解决方法主键索引重新排序

    mysql插入报主键冲突,解决方法主键索引重新排序 参考文章: (1)mysql插入报主键冲突,解决方法主键索引重新排序 (2)https://www.cnblogs.com/nizuimeiabc1 ...

  7. mysql用一个表更新另一个表的方法

    Solution 1:  修改1列(navicate可行) update student s, city c set s.city_name = c.name where s.city_code = ...

  8. mysql索引统计信息更新_MySQL索引统计信息更新相关的参数

    MySQL统计信息相关的参数: 1. innodb_stats_on_metadata(是否自动更新统计信息),MySQL 5.7中默认为关闭状态 仅在统计信息配置为非持久化的时候生效. 也就是说在i ...

  9. mysql参数积累 持续更新。。。

    mysql参数积累 持续更新... 以下是Mysql数据库服务器配置文件my.ini的详细配置.应用场合是InnoDB引擎,2核CPU, 32位SUSE. [client] #password = y ...

最新文章

  1. SQL Server新一轮更新
  2. linux学习笔记(软件包管理)
  3. 双赛道近四百万奖金,2021全国人工智能大赛来了!
  4. lolfps高但画面不流畅_全面解析:高刷新率真能提高FPS游戏技术?
  5. 【BZOJ3590】[Snoi2013]Quare 状压DP
  6. paddlenlp 任务清单 中文分词、中文纠错、文本相似度、情感分析、词性标注等一键
  7. c++: internal compiler error: Killed
  8. 使用维护Relationship
  9. python爬取正确但不出文件_使用Python爬取微信公众号文章并保存为PDF文件(解决图片不显示的问题)...
  10. 如何使用print()打印类的实例?
  11. 3个阶段 项目征名_中资企业新签的3个海外项目开工
  12. Dubbo zookeeper 初探【转】
  13. 谈谈 DNS 原理及“域名劫持”和“域名欺骗/域名污染”
  14. Mybatis-Plus如何使用
  15. android编译错误记录
  16. C语言 static 声明静态变量?大佬原来用它干这事!
  17. 【学习笔记】数据结构之单链表(先进先出、先进后出)
  18. 日常用语--征求意见
  19. matlab中求x的y次幂,Matlab求关于x,y的三元函数的幂的拟合
  20. 基于Vue项目的回到顶部插件

热门文章

  1. java听课笔记(四)
  2. ODBC、OLE连接各种数据库的连接字符串
  3. DataTable的Compute功能详解
  4. web集群时session同步的3种方法
  5. 魔法引用函数magic_quotes_gpc和magic_quotes_runtime的区别和用法
  6. 超强的jquery极品插件--色彩选择器类/ 右键菜单类/ 图片新闻flash展示类
  7. 通过Python在Windows或Linux上快速搭建HTTP服务器
  8. 【FFmpeg】结构体详解(一):AVCodec、AVCodecContext、AVCodecParserContext、AVFrame、AVFormatContext 、AVIOContext
  9. api数据加密的定义_云原生时代,如何构建开箱即用的数据加密防护?
  10. SpringBoot复习:5(配置绑定)