事务的隔离级别——解决脏读、不可重复度、幻读

本文涉及的产品
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
简介: 事务的隔离级别——解决脏读、不可重复度、幻读

事务隔离级别


先看一下如何查看事务隔离级别。

# 查看默认事务隔离级别(session)
select @@transaction_isolation;
# 查看当前会话的隔离级别
select @@session.transaction_isolation;
# 查看全局的事务隔离级别
select @@global.transaction_isolation;
复制代码

Mysql 下事务的隔离级别有四种,由低到高依次为 Read uncommittedRead committedRepeatable read (默认)、Serializable ,这四个级别中的后三个级别可以逐个解决脏读不可重复读幻读的问题。


1. 脏读

对于两个事务T1与T2,T1读取了已经被T2更新但是还没有提交的字段之后,若此时T2回滚,T1读取的内容就是临时并且无效的。


示例:

打开两个Mysql客户端,分别执行下面操作,查询当前会话的隔离级别(默认 REPEATABLE READ )。修改当前会话隔离级别为( READ UNCOMMITTED )。全局事务隔离级别仍然为 REPEATABLE READ

mysql> SELECT @@session.transaction_isolation;
+-------------------------+
| @@transaction_isolation |
+-------------------------+
| REPEATABLE-READ         |
+-------------------------+
mysql> SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;    # 修改会话隔离级别
mysql> SELECT @@session.transaction_isolation;    # 当前会话隔离级别已修改
+---------------------------------+
| @@session.transaction_isolation |
+---------------------------------+
| READ-UNCOMMITTED                |
+---------------------------------+
mysql> SELECT @@global.transaction_isolation;    # 全局事务隔离级别未修改
+--------------------------------+
| @@global.transaction_isolation |
+--------------------------------+
| REPEATABLE-READ                |
+--------------------------------+
复制代码

之后黑框用来做更新,白框用来查询。

image.png

由于黑框的 ④ 回滚,白色背景的客户端中 ③ 读取的数据就是临时并且无效的。即脏读。


2. 不可重复读

对于两个事务T1和T2,T1读取了一个字段,然后T2更新了该字段并提交之后,当T1再次读取的时候,结果不一致的情况发生。

image.png

由于黑框的更新操作,白框出现两次读取的结果不一致。


3. 幻读

 对于两个事务T1、T2,T1从表中读取数据,然后T2进行了INSERT操作并提交,当T1再次读取的时候,结果不一致的情况发生。

image.png

由于黑框的插入操作,白框出现两次读取的结果不一致。


几种现象在各隔离级别中出现的可能性

隔离级别 脏读(Dirty Read) 不可重复读(NonRepeatable Read) 幻读(Phantom Read)
未提交读(Read uncommitted) 可能 可能 可能
已提交读(Read committed) 不可能 可能 可能
可重复读(Repeatable read) 不可能 不可能 可能
可串行化(Serializable ) 不可能 不可能 不可能



相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
人工智能 JSON 数据可视化
OpenAI调用接口多轮对话Multi Turn Multi Agent 多轮多角色对话调试和可视化工具Dialogue Visualization
伴随着生成式人工智能技术发展,进2年涌现出大语言模型LLM/Agent系统/AI推理等众多方向的技术项目和论文。其中对话系统,智能体交互是用户通过UX界面和AI系统进行交互,这种交互有时候也是多模态(用户输入文字/语音/图像)等等。在调用OpenAI 的对话接口时候,有时候需要把对话结果打印出来检查是否有bug,JSON数据格式就比较难看出来了,尤其是有多角色的多轮对话。这个时候可以借助一些在线的"对话"可视化的工具 (Online Dialogue Visualization Tool) DeepNLP Dialogue Visualization Tool,方便产品经理,算法研发,学术研究
OpenAI调用接口多轮对话Multi Turn Multi Agent 多轮多角色对话调试和可视化工具Dialogue Visualization
|
8月前
|
人工智能 运维 关系型数据库
云服务API与MCP深度集成,RDS MCP最佳实践
近日,阿里云数据库RDS发布开源RDS MCP Server,将复杂的技术操作转化为自然语言交互,实现"对话即运维"的流畅体验。通过将RDS OpenAPI能力封装为MCP协议工具,用户只需像聊天一样描述需求,即可完成数据库实例创建、性能调优、故障排查等专业操作。本文介绍了RDS MCP(Model Context Protocol)的最佳实践及其应用,0代码,两步即可轻松完成RDS实例选型与创建,快来体验!
云服务API与MCP深度集成,RDS MCP最佳实践
|
SQL 关系型数据库 MySQL
【MySQL】脏读、不可重复读、幻读介绍及代码解释
【MySQL】脏读、不可重复读、幻读介绍及代码解释
|
弹性计算 JavaScript Java
在 Intellij IDEA 中部署 Spring Boot / Spring Cloud 应用到阿里云
Spring Cloud 和 Spring Boot 可以说是当前最流行的微服务开发框架了,在本文中,将向读者介绍如何在 在 Intellij IDEA 中部署 Spring Boot / Spring Cloud 应用到阿里云。
14263 90
|
运维 分布式计算 供应链
医院HIS系统源码,全套云化医院信息管理系统
HIS系统完全基于云端部署,采用B/S架构,并通过软件即服务(SaaS)的形式面向二级医院的可快速交付、便捷运维、云化的医院核心业务平台产品。融合医院HIS和EMR两大主营系统,构建涵盖患者、费用、医嘱、电子病历等核心业务的医院基础信息系统。将HIS与电子病历整合一起形成一体化医护工作站。
704 0
医院HIS系统源码,全套云化医院信息管理系统
|
机器人
太空采矿:地球资源枯竭后的替代方案
【10月更文挑战第10天】太空采矿作为地球资源枯竭后的替代方案,具有广阔的前景和潜力。然而,要实现太空采矿的商业化和可持续发展,还需要克服一系列技术、经济和法律挑战。未来,随着技术的不断进步和国际合作的加强,太空采矿将成为人类社会新的资源来源和经济增长点。让我们共同期待太空采矿的美好未来!
|
数据挖掘 Python
Scipy 高级教程——统计学
Scipy 高级教程——统计学【1月更文挑战第11篇】
353 4
Scipy 高级教程——统计学
|
安全 Android开发 数据安全/隐私保护
安卓应用开发中的常见挑战及解决策略
【10月更文挑战第7天】在安卓应用开发的旅程中,开发者常面临各种挑战,从设备兼容性到性能优化,再到用户界面设计。本文将深入探讨这些常见问题,并提供实用的解决策略,帮助开发者提升应用质量和用户体验。我们将通过代码示例和实践建议,展示如何克服这些挑战,打造更流畅、更吸引人的安卓应用。
340 0
|
存储 编译器 数据处理
栈溢出及解决方法
栈溢出及解决方法
|
设计模式 开发框架 Java
Spring 依赖注入方式有哪些?
Spring 依赖注入方式有哪些?
648 0
Spring 依赖注入方式有哪些?

热门文章

最新文章