当前位置: 首页 > news >正文

mysql更改隔离级别_MySQL修改事务隔离级别的暗门

0、导读

我们知道,MySQL里可以动态修改事务隔离级别(TRANSACTIOIN ISOLATION LEVEL),既可以加 GLOBAL 关键字直接修改全局的设置,也可以加 SESSION 关键字只修改当前会话的设置。那么,如果两个关键字都不加,会出现什么情况呢?

1、调整事务隔离级别

MySQL里,可以直接用 SET 指令调整事务隔离级别,既可以对全局调整,也可以只调整当前会话,其用法见下:

SET [GLOBAL | SESSION] TRANSACTION

[ REPEATABLE READ

| READ COMMITTED

| READ UNCOMMITTED

| SERIALIZABLE ]

我们都知道指定 GLOBAL 关键字是可以修改全局的设置,用这个方式修改完后,已经存在的连接还不会生效,只有对新建立的连接才会起作用。

而指定 SESSION 关键字则是只修改当前连接会话的设置,修改完后立即生效,再次连接后会恢复成全局的设置,对其他连接/会话也不起作用。

另外,如果都不指定 GLOBAL、SESSION 关键字,会发生什么情况呢?官方文档给出的解释是这样的:

Without any SESSION or GLOBAL keyword, the statement applies to the next (not started) transaction performed within the current session. Subsequent transactions revert to using the SESSION isolation level.

意思是说:采用这种方式设置后,本次连接当前事务还未起作用,要到下一个(尚未启动的)新事务才起作用,下一个事务结束后,又将恢复成本次 SESSION中原先的设置。

2、实验演示

为了证实上面的说法,我们可以做一个演示,详细过程见下:

T1

T2

select @@tx_isolation;

READ-COMMITTED

select @@tx_isolation;

READ-COMMITTED

set transaction isolation level SERIALIZABLE;

select @@tx_isolation;

+—————-+

| @@tx_isolation |

+—————-+

| READ-COMMITTED |

这种方式调整完后,可以看到隔离级别还是RC

select @@tx_isolation;

READ-COMMITTED

begin;

select * from t;

| a | b | c | d |

+—+—+—+—+

| 1 | 2 | 3 | 4 |

begin;

select * from t;

| a | b | c | d |

+—+—+—+—+

| 1 | 2 | 3 | 4 |

update t set d = 5 where a = 1;

被阻塞了,耐心等待中~

rollback;

Query OK, 1 row affected (13.13 sec)

Rows matched: 1  Changed: 1  Warnings: 0

等到T1执行rollback后才能继续,等了10多秒

rollback;

当前连接再次启动新事务测试

select @@tx_isolation;

READ-COMMITTED

可以看到隔离级别还是RC

select @@tx_isolation;

READ-COMMITTED

begin;

select * from t;

| a | b | c | d |

+—+—+—+—+

| 1 | 2 | 3 | 4 |

begin;

select * from t;

| a | b | c | d |

+—+—+—+—+

| 1 | 2 | 3 | 4 |

update t set d = 20 where a = 1;

Query OK, 1 row affected (0.00 sec)

Rows matched: 1  Changed: 1  Warnings: 0

立即完成,没有阻塞

rollback;

rollback;

其中,测试表t的建表DDL:

CREATE TABLE `t` (

`a` int(11) NOT NULL,

`b` int(11) NOT NULL,

`c` int(11) NOT NULL,

`d` int(11) NOT NULL,

PRIMARY KEY (`a`,`b`),

KEY `i_c` (`c`)

) ENGINE=InnoDB;

该表中只有一条记录:

SELECT * FROM t;

+—+—+—+—+

| a | b | c | d |

+—+—+—+—+

| 1 | 2 | 3 | 4 |

+—+—+—+—+

3、建议

如果需要全局调整事务隔离级别,最好是在 my.cnf 全局配置文件中直接设置好。

而如果是要在当前会话中临时调整,可以不要加上 SESSION 关键字,这样的话,当前事务结束下一个新事务开始后,会自行恢复 SESSION 的设置,无需人为调整,更加方便。

觉得文章有用?立即:

和朋友一起 共学习 共进步!

猜想失败,您看看下面的文章有用吗?

相关文章:

  • mysql alter user语法_MySQL 最基本的语法/语句
  • percona mysql 同步_Percona MySQL5.6 半同步复制
  • mysql-FONT备份数据库_mysql-FONT备份数据库
  • mysql 批量替换表前缀_如何批量修改mysql的表前缀名称
  • mysql datadir 目录权限不够_MySQL数据目录更改及相关问题解决方案
  • windows mysql开启慢查询日志_mysql开启慢查询日志的方法
  • jsp数据添加乱码mysql_JSP插入MySQL数据库中文乱码问题解决
  • python切片赋值_Python中实现:变量和变量赋值的几种形式
  • linux shell mysql 遍历_shell 脚本中获取mysql多个字段的值
  • mysql current read_浅谈MySQL之 REPEATABLE-READ.
  • mysql 索引pk_细说mysql索引
  • mysql 6.0 jar_maven搭建ssm框架是使用最新mysql 6.0jar遇到的问题
  • rhel7最小化安装 mysql_安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(二)
  • 链接索引 mysql_mysql索引
  • linux c epoll mysql_epoll简介和使用
  • ----------
  • 实现windows 窗体的自己画,网上摘抄的,学习了
  • 78. Subsets
  • Angularjs之国际化
  • css的样式优先级
  • docker-consul
  • Fundebug计费标准解释:事件数是如何定义的?
  • Java 实战开发之spring、logback配置及chrome开发神器(六)
  • Java-详解HashMap
  • Node 版本管理
  • PhantomJS 安装
  • PHP 7 修改了什么呢 -- 2
  • Rancher-k8s加速安装文档
  • Spring核心 Bean的高级装配
  • vue.js框架原理浅析
  • 基于游标的分页接口实现
  • 前端 CSS : 5# 纯 CSS 实现24小时超市
  • 如何胜任知名企业的商业数据分析师?
  • 微信支付JSAPI,实测!终极方案
  • 怎样选择前端框架
  • 做一名精致的JavaScripter 01:JavaScript简介
  • 通过调用文摘列表API获取文摘
  • #宝哥教你#查看jquery绑定的事件函数
  • (01)ORB-SLAM2源码无死角解析-(56) 闭环线程→计算Sim3:理论推导(1)求解s,t
  • (2021|NIPS,扩散,无条件分数估计,条件分数估计)无分类器引导扩散
  • (Java岗)秋招打卡!一本学历拿下美团、阿里、快手、米哈游offer
  • (zhuan) 一些RL的文献(及笔记)
  • (超详细)语音信号处理之特征提取
  • (附源码)spring boot建达集团公司平台 毕业设计 141538
  • (附源码)springboot 基于HTML5的个人网页的网站设计与实现 毕业设计 031623
  • (七)Java对象在Hibernate持久化层的状态
  • (十) 初识 Docker file
  • (五)Python 垃圾回收机制
  • (转)jdk与jre的区别
  • (转)visual stdio 书签功能介绍
  • (转)重识new
  • (转载)Linux网络编程入门
  • .bat批处理(二):%0 %1——给批处理脚本传递参数
  • .bat批处理(九):替换带有等号=的字符串的子串
  • .CSS-hover 的解释