MySQL RR隔离级别的更新冲突策略
对于事务的隔离级别,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隔离级别的更新冲突策略相关推荐
- mysql 中 RC、RR隔离级别的原理及区别
今天分享 mysql 中 RC.RR隔离级别的原理及区别: 1.首先简介mysql四种隔离级别: 1)未提交读(READ UNCOMMITED)脏读 2) 已提交读 (READ COMMITED)简称 ...
- MySQL原理--隔离级别的实现方式--MVCC
原文网址:MySQL原理--隔离级别的实现方式--MVCC_IT利刃出鞘的博客-CSDN博客 简介 本文介绍MySQL的隔离级别的实现方式--MVCC. 这也是Java后端面试题中常见的一个问题. M ...
- MySQL RR隔离级别解决幻读问题?
首先,讲mysql的隔离级别之前需要复习一下事务的四个特性 (注:mysql存储引擎InnoDB)(待完善) 事务的四个特性(ACID): 原子性(Atomicity) 一致性(Consistency ...
- 分布式系统中一些主要的副本更新策略——Dynamo/Cassandra/Riak同时采取了主从式更新的同步+异步类型,以及任意节点更新的策略。...
分布式系统中一些主要的副本更新策略. 1.同时更新 类型A:没有任何协议,可能出现多个节点执行顺序交叉导致数据不一致情况. 类型B:通过一致性协议唯一确定不同更新操作的执行顺序,从而保证数据一致性 2 ...
- mybatisPlus中的field-strategy(字段更新插入策略):null值插入和更新问题
目录 mybatisPlus中null值插入和更新问题 实际项目解决方法示例一 实际项目解决方法示例二 field-strategy字段更新插入策略介绍 枚举类FieldStrategy源码 枚举类字 ...
- mysql插入报主键冲突,解决方法主键索引重新排序
mysql插入报主键冲突,解决方法主键索引重新排序 参考文章: (1)mysql插入报主键冲突,解决方法主键索引重新排序 (2)https://www.cnblogs.com/nizuimeiabc1 ...
- mysql用一个表更新另一个表的方法
Solution 1: 修改1列(navicate可行) update student s, city c set s.city_name = c.name where s.city_code = ...
- mysql索引统计信息更新_MySQL索引统计信息更新相关的参数
MySQL统计信息相关的参数: 1. innodb_stats_on_metadata(是否自动更新统计信息),MySQL 5.7中默认为关闭状态 仅在统计信息配置为非持久化的时候生效. 也就是说在i ...
- mysql参数积累 持续更新。。。
mysql参数积累 持续更新... 以下是Mysql数据库服务器配置文件my.ini的详细配置.应用场合是InnoDB引擎,2核CPU, 32位SUSE. [client] #password = y ...
最新文章
- SQL Server新一轮更新
- linux学习笔记(软件包管理)
- 双赛道近四百万奖金,2021全国人工智能大赛来了!
- lolfps高但画面不流畅_全面解析:高刷新率真能提高FPS游戏技术?
- 【BZOJ3590】[Snoi2013]Quare 状压DP
- paddlenlp 任务清单 中文分词、中文纠错、文本相似度、情感分析、词性标注等一键
- c++: internal compiler error: Killed
- 使用维护Relationship
- python爬取正确但不出文件_使用Python爬取微信公众号文章并保存为PDF文件(解决图片不显示的问题)...
- 如何使用print()打印类的实例?
- 3个阶段 项目征名_中资企业新签的3个海外项目开工
- Dubbo zookeeper 初探【转】
- 谈谈 DNS 原理及“域名劫持”和“域名欺骗/域名污染”
- Mybatis-Plus如何使用
- android编译错误记录
- C语言 static 声明静态变量?大佬原来用它干这事!
- 【学习笔记】数据结构之单链表(先进先出、先进后出)
- 日常用语--征求意见
- matlab中求x的y次幂,Matlab求关于x,y的三元函数的幂的拟合
- 基于Vue项目的回到顶部插件
热门文章
- java听课笔记(四)
- ODBC、OLE连接各种数据库的连接字符串
- DataTable的Compute功能详解
- web集群时session同步的3种方法
- 魔法引用函数magic_quotes_gpc和magic_quotes_runtime的区别和用法
- 超强的jquery极品插件--色彩选择器类/ 右键菜单类/ 图片新闻flash展示类
- 通过Python在Windows或Linux上快速搭建HTTP服务器
- 【FFmpeg】结构体详解(一):AVCodec、AVCodecContext、AVCodecParserContext、AVFrame、AVFormatContext 、AVIOContext
- api数据加密的定义_云原生时代,如何构建开箱即用的数据加密防护?
- SpringBoot复习:5(配置绑定)