MySQL 事务的隔离级别及锁操作的一点点演示
MySQL 版本:5.7
一、测试数据
测试数据库:test;测试表:tt
CREATE TABLE `tt` (
`id` int(11) DEFAULT NULL,
`name` varchar(100) DEFAULT NULL,
KEY `name_idx` (`name`),
KEY `id_idx` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
插入测试数据:
insert into tt value(1, "a”);
insert into tt value(1, "b”);
insert into tt value(2, “b");
二、事务隔离级别设置
1、查询当前事务隔离级别
mysql> select @@transaction_isolation;
+-------------------------+
| @@transaction_isolation |
+-------------------------+
| READ-UNCOMMITTED |
+-------------------------+
2、设置当前事务隔离级别
set global transaction_isolation = 'read-uncommitted';
设置隔离级别后,后续开启的连接 Session 才会生效。
三、读未提交(READ-UNCOMMITTED)
开启两个连接 Session:
Session 1 | Session 2 |
开启事务,更新 id 为 2 的记录 name 为 “ss" ,保持事务未提交: Query OK, 0 rows affected (0.00 sec) |
|
开启事务,查询 id 为 2 的记录 name 值: mysql> begin; 事务 2 可以查询到事务 1 未提交的数据变更。对于事务 2 来说,这条数据是脏数据。 |
四、读已提交(READ-COMMITTED)
解决 READ-UNCOMMITTED 隔离级别下产生的脏读现象。
设置事务隔离级别:
mysql> set global transaction_isolation = 'read-committed';
Query OK, 0 rows affected (0.00 sec)
重新开启测试 Session,查询事务隔离级别:
mysql> select @@transaction_isolation;
+-------------------------+
| @@transaction_isolation |
+-------------------------+
| READ-COMMITTED |
+-------------------------+
Session 1 | Session 2 |
开启事务,更新 id 为 2 的记录 name 为 “ssr”:
mysql> begin; |
|
查询数据,无法查询到 事务 1 未提交的数据:
mysql> begin; |
|
提交事务:
mysql> commit ; |
|
查询数据,得到的是事务 1 中已提交的数据变更:
mysql> select * from tt where id = 2; 对于事务 2 来说,在事务 1 提交前后,获取到的数据是不一样的,即不可重复读问题。
|
五、可重复读(REPEATABLE-READ)
解决 READ-COMMITTED 隔离级别下产生的不可重复读现象。
Session 1中 设置事务隔离级别:
mysql> set global transaction_isolation = 'repeatable-read';
Query OK, 0 rows affected (0.01 sec)
重新开启事务,查询隔离级别:
mysql> select @@transaction_isolation;
+-------------------------+
| @@transaction_isolation |
+-------------------------+
| REPEATABLE-READ |
+-------------------------+
1 row in set (0.00 sec)
Session 1 | Session 2 |
Session 2 开启事务,查询数据: mysql> begin; |
|
更新 id 为 2 的记录 name 为 “ssrr”, 并提交事务: mysql> begin; |
|
Session 2 重新查询数据: mysql> select * from tt where id = 2; 当前数据未变。 但是问题是,事务 1 已经进行了数据变更,并且提交,事务 2 无法获取所查记录最新变更信息。 |
为什么事务 2 前后两次相同查询所得的数据是一样的?
一致性读(consistent read)查询模式:基于【某一时刻】的【数据快照】提供读查询结果。无论查询的数据是否被其它事务所改变。这个【某一时刻】在 repeatable-read 隔离级别下为事务中第一次执行查询操作的时间点,read-committed 隔离级别下,数据快照会在每一次执行一致性读操作时进行重置。
幻读
如何避免:加X锁
Next-key lock:Record lock + Gap lock
六、关于 Next-key lock 加锁
调整表 tt 索引及数据:
mysql> show create table tt;
+-------+-------------------------------------------------------+
| Table | Create Table |
+-------+-------------------------------------------------------+
| tt | CREATE TABLE `tt` (
`id` int(11) NOT NULL,
`name` varchar(100) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_age` (`age`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+-------+-------------------------------------------------------+
1 row in set (0.00 sec)
mysql> select * from tt;
+-----+------+------+
| id | name | age |
+-----+------+------+
| 90 | aa | 10 |
| 102 | bb | 15 |
| 108 | cc | 20 |
| 130 | dd | 25 |
| 150 | ee | 30 |
+-----+------+------+
1、等值条件
对于使用唯一性索引:加的锁为 Record lock
Session 1 | Session 2 |
开启事务,查询 id 为 108 记录加 X lock: mysql> begin; |
|
开启事务,记录前后紧邻 gap 插入记录: mysql> begin; |
对于使用非唯一性索引:加的锁为 Record lock + Gap lock 前后紧邻 gap
:首先加锁 (15, 20],因为是非唯一索引,继续向后查找到第一个不满足条件的元素 25 加 gap lock (20, 25)
Session 1 | Session 2 |
开启事务,查询 age 为 20 记录加 X lock: mysql> begin; |
|
开启事务,记录紧邻前后 gap 插入记录: mysql> begin; 操作均被 block。 紧邻 gap 以外插入记录: mysql> insert into tt value(100, 'ab', 12); 记录均可成功插入 |
对于不使用索引的:加锁为全部记录及gap
Session1
|
Session2 |
开启事务,查询 name 为 ‘cc’ 记录加 X lock: mysql> begin; |
|
开启事务,各个间隙尝试插入记录: mysql> begin; 操作均被 block。 更新记录: mysql> update tt set age = 21 where name = 'cc'; 操作均被 block。 |
MySQL 事务的隔离级别及锁操作的一点点演示的更多相关文章
- Mysql数据库事务的隔离级别和锁的实现原理分析
Mysql数据库事务的隔离级别和锁的实现原理分析 找到大神了:http://blog.csdn.net/tangkund3218/article/details/51753243 InnoDB使用MV ...
- MySQL事务学习-->隔离级别
MySQL事务学习-->隔离级别 6 事务的隔离级别 设置的目的 在数据库操作中,为了有效保证并发读取数据的正确性,提出的事务隔离级别. 数据库是要被广大客户所共享访问的,那么在数据库操作过程中 ...
- MySQL事务及隔离级别详解
MySQL事务及隔离级别详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.MySQL的基本架构 MySQL的基本架构可以分为三块,即连接池,核心功能层,存储引擎层. 1> ...
- [转]MySQL事务学习-->隔离级别
From : http://blog.csdn.net/mchdba/article/details/12837427 6 事务的隔离级别 设置的目的 在数据库操作中,为了有效保证并发读取数据的正确性 ...
- MySQL事务及隔离级别(读书小结)
标签: MySQL事务 隔离 0.什么是事务? 事务是指MySQL的一些操作看做是一个不可分割的执行单元.事务的特点是要么所有操作都执行成功,要么一个都不执行.也就是如果一个事务有操作执行失败,那么就 ...
- MySQL事务的隔离级别
为什么需要隔离 当多个线程都开启事务操作数据库中的数据时,数据库系统要能进行隔离操作,以保证各个线程获取数据的准确性,在介绍数据库提供的各种隔离级别之前,我们先看看如果不考虑事务的隔离性,会发生的几种 ...
- 高性能MySQL--innodb中事务的隔离级别与锁的关系
最近买了<高性能MySQL>这本书回来看,从中收益颇多!我来一吐为快! 我们都知道事务,那么在什么情况下我们需要使用事务呢? 银行应用是解释事务的一个经典例子.假设一个银行的数据库有两张表 ...
- mysql 事务、隔离级别
一.事务的四大特性(ACID) 1.原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节.事务执行过程中出错,会回滚到事务开始前的状态,所有的操作就像没有 ...
- MySQL——事务ACID&隔离级别
数据库事务ACID&隔离级别 什么是事务 事务是用户定义的一个数据库操作序列.这些操作要么全执行,要么全不执行,是一个不可分割的工作单元.在关系型数据库中,事务可以是一条SQL语句,也可以是一 ...
随机推荐
- Decoupling Representation and Classifier for Long-tailed Recognition
目录 概 主要内容 Sampling 分类器 代码 Kang B., Xie S., Rohrbach M., Yan Z., Gordo A., Feng J. and Kalantidis Y. ...
- 一文解析Apache Avro数据
摘要:本文将演示如果序列化生成avro数据,并使用FlinkSQL进行解析. 本文分享自华为云社区<[技术分享]Apache Avro数据的序列化.反序列&&FlinkSQL解析 ...
- VUE的学习_从入门到放弃(一)
一.vue的功能及作用 工作方式如下 1.不用操作DOM 2.单页面应用web项目 简称:SPA 3.当下各种新框架都采用的类似Vue或者类似React的语法去作为主语法,微信小程序/MpVue... ...
- linux(CentOS7) 之 jdk1.8 下载及安装
下载 一.百度搜索oracle,进入官网(或直接进入官网https://www.oracle.com) 二.选择 products 下的 java 三.选择Download Java 四.往下翻找到J ...
- Oracle:使用PL-SQL登录时报ORA-12541:无监听程序的解决办法
背景: 在自己公司安装的Oracle,当时Oracle的监听地址都是写的公司的地址 后来由于项目需要,办公地点转移到了客户处, 大概有半年没有以sys用户登录数据库了. 最近在上下班途中学习Djang ...
- [ flask ] 解耦models(解决models文件太臃肿的问题)
问题描述 用博客项目来描述,我们在models中定义了用户表(User).文章表(Post).通知表(Notification).等等.随着我们开发的深入,添加的功能越来越多,到后期models文件会 ...
- Spark词频前十的统计练习
注:图片如果损坏,点击文章链接:https://www.toutiao.com/i6815390070254600712/ 承接上一个文档<Spark本地环境实现wordCount单词计数> ...
- 【Warrior刷题笔记】剑指offer 32. 三道题,让你学会二叉树的深度广度优先遍历与递归迭代技术
题目一 剑指 Offer 32 - I. 从上到下打印二叉树 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/cong-shang-dao-xi ...
- Cache一致性协议与伪共享问题
Cache一致性协议 在说伪共享问题之前,有必要聊一聊什么是Cache一致性协议 局部性原理 时间局部性:如果一个信息项正在被访问,那么在近期它很可能还会被再次访问 比如循环.方法的反复调用等 空间局 ...
- 深度介绍Flink在字节跳动数据流的实践
本文是字节跳动数据平台开发套件团队在1月9日Flink Forward Asia 2021: Flink Forward 峰会上的演讲分享,将着重分享Flink在字节跳动数据流的实践. 字节跳动数据流 ...