【事务隔离级别】——深度探索数据库的事务隔离级别

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 设置事务隔离级别的方式有很多种,上篇文章中只简单提到了理论知识,这里数据库以MySQL为例,来动手设置一下事务的隔离级别并观察一下事务的隔离级别到底起到什么作用。

 设置事务隔离级别的方式有很多种,上篇文章中只简单提到了理论知识,这里数据库以MySQL为例,来动手设置一下事务的隔离级别并观察一下事务的隔离级别到底起到什么作用。


 我们都知道,每启动一下MySQL,就会获得一个数据库连接,每个数据库连接有一个全局变量@@tx_isolation,表示当前连接中事务的隔离级别。


 查看事务隔离级别


 命令行登录mysql,查看当前事务隔离级别:

 select @@tx_isolation;


  或者

select @@session.tx_isolation;


57.png


  可以看到mysql默认的事务隔离级别为REPEATABLE-READ

  查看系统全局事务离级别可以用:

select @@global.tx_isolation;


  **设置事务隔离级别**

  设置当前事务隔离级别

set session transaction isolation level repeatable read;

  设置系统全局(默认)事务隔离级别

set global transaction isolation level repeatable read;

  **read uncommitted测试**


  打开一个客户端A,并设置当前事务模式为read uncommitted(未提交读),查询表account的初始值:

58.png


  在客户端A的事务提交之前,打开另一个客户端B,更新表account:

59.png


  这时,虽然客户端B的事务还没提交,但是客户端A就可以查询到B已经更新的数据:

60.png

  一旦客户端B的事务因为某种原因回滚,所有的操作都将会被撤销,那客户端A查询到的数据其实就是脏数据:


61.png


  **read committed测试**

  针对上面的问题,把客户端A的事务隔离级别设置为read committed,再重复上面的步骤,会发现B在事务结束之前,A并不能查询到B所做的操作。

  客户端A的执行结果

62.png


  客户端B的执行结果


63.png


 但是正如上文所说,这种隔离级别下可能导致前事务中多次读取特定记录的结果不相同,比如客户端A事务隔离级别为read committed,在A的一个事务中,执行两次相同的查询,在这两次查询的中间,客户端B对数据进行更改并提交事务,那么会导致客户端A的两次查询结果不一致,导致“不可重复读”的麻烦。


 客户端A的执行结果


64.png


  客户端B的执行结果


65.png


   **repeatable read测试**

 同理,如果设置了repeatable read隔离级别,就可以保证在当前事务中多次执行相同查询的结果集相同,实现“可重复读”。


 同样以客户端A设置事务隔离级别为repeatable read为例,执行结果如下:


 客户端A的执行结果


66.png


  客户端B的执行结果

67.png


  上篇文章说到,这种隔离级别会导致“幻读”,比如客户端A中事务操作表中符合条件的若干行,同时客户端B中事务插入符合A操作条件的数据行,然后再提交。究竟会发生什么nie~~

  小编为此也进行了测试:

  客户端A的执行结果

68.png


  客户端B的执行结果


69.png

 结果却不像我们预测的那样,为客户端A中的事务设置隔离级别为repeatable read,但在客户端B中的事务插入数据后,A并没有出现“幻读”的现象。查了资料才知道,原来在mysql中,不会出现幻读。mysql的实现和标准定义的RR隔离级别有差别。


当然,

 上篇文章说到的只是SQL规范所规定的标准,不同的数据库具体的实现可能会有些差异,所以还是以实际为准~~

 实践出真知,所以每接触到一些理论知识时,最好能够实践一把,自己动手去探索,总会带给你意想不到的收货哦。


相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
3月前
|
中间件 关系型数据库 Go
Go语言数据库编程:数据迁移与事务控制
本文介绍了《Go语言实战指南》中关于数据库编程的核心内容,涵盖使用 GORM 进行数据迁移与事务控制。主要内容包括:AutoMigrate 方法自动创建或更新表结构;事务控制的自动与手动实现方式;事务隔离级别的设置;以及在 Gin 框架中统一管理事务的实践建议。适合开发阶段的数据库结构管理和事务性操作需求。
|
6月前
|
SQL 数据库 索引
【YashanDB数据库】大事务回滚导致其他操作无法执行,报错YAS-02016 no free undo blocks
大事务回滚导致其他操作无法执行,报错YAS-02016 no free undo blocks
|
9月前
|
SQL 存储 Java
数据库———事务及bug的解决
事务的一些概念,并发事务以及并发事务引起的bug,脏读,不可重复读,幻读,数据库中的隔离级别,事务的简单应用
|
11月前
|
数据库
什么是数据库的事务隔离级别,有什么作用
【10月更文挑战第21】什么是数据库的事务隔离级别,有什么作用
165 3
|
11月前
|
存储 关系型数据库 数据挖掘
什么是数据库的事务隔离级别
【10月更文挑战第21】什么是数据库的事务隔离级别
251 1
|
11月前
|
存储 数据库 数据库管理
数据库事务安全性控制如何实现呢
【10月更文挑战第15天】数据库事务安全性控制如何实现呢
|
11月前
|
存储 数据库 数据库管理
什么是数据库事务安全性控制
【10月更文挑战第15天】什么是数据库事务安全性控制
|
11月前
|
供应链 数据库
数据库事务安全性控制有什么应用场景吗
【10月更文挑战第15天】数据库事务安全性控制有什么应用场景吗
|
11月前
|
SQL 关系型数据库 数据库
如何在数据库中实现事务控制呢
【10月更文挑战第15天】如何在数据库中实现事务控制呢
177 1
|
11月前
|
存储 SQL 关系型数据库
什么是数据库隔离级别
【10月更文挑战第15天】什么是数据库隔离级别

热门文章

最新文章