前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >数据库隔离级别

数据库隔离级别

原创
作者头像
写bug的高哈哈
发布于 2024-11-08 05:35:44
发布于 2024-11-08 05:35:44
1030
举报

在阅读《高性能MySQL》这本书的过程中,我复习了一下关于数据库事务中“隔离性”的章节。回想起来,在大学数据库系统课程中应该学过这一部分内容,但现在确实记不清了。数据库中的事务是一种机制,允许连续执行一组SQL指令,如果在执行这一系列指令的过程中出现任何错误,整个事务将会回滚至最初的状态,以此保证事务要么整体成功,要么整体失败,不会出现部分成功、部分失败的情况。

举例来说,假设有两张银行账户表,分别记录了Alice和Bob各自的账户余额,初始状态下两人都有1000元。

现在Alice转账300元给Bob,正常的操作流程应该是执行两条SQL语句:

代码语言:sql
AI代码解释
复制
UPDATE balances SET balance = 700 WHERE account = "Alice";
UPDATE balances SET balance = 1300 WHERE account = "Bob"; 

在执行第一行操作时,如果系统出现问题导致未能执行第二行操作,这样会出现Alice的钱被扣除,而Bob的账户却没有增加相应金额的情况。这种错误发生后修复起来会非常麻烦。为此,数据库中的事务(Transaction)机制就是为了解决这类问题而设计的,它可以确保一个交易要么全部成功,要么全部失败,绝不会停留在中间状态。

在SQL中,可以声明事务的开始和结束,并在必要时回滚到原始状态,这样就能有效避免上述问题的发生。通过使用事务,当涉及到诸如银行转账(如从Alice账户扣款并转入Bob账户)这样的操作时,可以确保资金变动要么全部完成,要么都不发生,以此来维护数据库的一致性和完整性。

代码语言:sql
AI代码解释
复制
BEGIN TRANSACTION;
UPDATE balances SET balance = 700 WHERE account = "Alice";
UPDATE balances SET balance = 1300 WHERE account = "Bob";
COMMIT;

关系型数据库在处理事务时通常要求具备四个特性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability),即ACID原则。今天我们主要讨论的是“隔离性”。隔离性确保在系统中有多个事务同时执行时,每个事务之间互不影响。

以下是关于隔离性经常会遇到的几种现象,图表中的Y轴代表时间顺序。

脏读(Dirty Read)

如果一个事务还未提交,但其他事务却能读取到它已更新但尚未提交的数据,这种情况称为脏读。例如,事务A在执行过程中两次读取Alice的账户余额,第一次读取时数值为1000,但在事务A未结束前,另一个事务B改变了Alice的账户余额为700,但尚未提交。这时事务A再次读取Alice的余额,读取到了尚未提交的700元,这就是脏读。

不可重复读(Non-repeatable reads)

在同一事务内,即使使用相同的查询语句多次读取数据,结果却发生了变化,这种情况称为不可重复读。例如,事务A第一次读取到Alice的账户余额为1000,在事务A还未结束时,事务B修改了Alice的余额为700并提交了事务。随后事务A再次执行相同的查询,这次读取到的余额变为700,这就构成了不可重复读。请注意,脏读也是不可重复读的一种特殊情况。

幻读(Phantom reads)

在同一个事务内连续两次执行同样的查询条件,但返回的记录数量却不一致,这种现象称为幻读。举例说明,事务A第一次查询账户余额在900到1000元范围内的账户,结果显示有Alice和Bob两人。而在事务A还未结束的同时,事务B将Alice的余额更新为700元。此时,如果事务A再次基于相同的条件查询,结果中的记录数会从原来的2条减至1条,这就发生了幻读。

隔离级别

针对上述提到的三种问题,SQL中通过不同的隔离等级来确定哪种等级的隔离性可以解决相应问题。隔离等级共有四种:

  • 读未提交(Read Uncommitted):在这种隔离等级下,事务可以读取到其他事务未提交的数据,所以在此等级下,上述三种问题都没有得到解决。
  • 读已提交(Read Committed):事务只能读取到其他事务已提交的数据,未提交的数据不会被读取,因此在这个等级中解决了脏读问题。
  • 可重复读(Repeatable Read):在一个事务中,只要查询条件相同,每次读取特定字段的数据都会得到相同的结果,这一等级解决了不可重复读问题。
  • 序列化(Serializable):在多个事务并发执行时,只要事务的执行顺序相同,无论何时执行都会得到相同的结果。例如,先执行事务A再执行事务B,在相同的条件下,每次执行都将产生一样的结果。在这个最高的隔离等级下,除了不可重复读之外,连幻读问题也会被一并解决。

顺便提及,MySQL的默认隔离等级是可重复读,但可以通过以下命令调整为序列化:

代码语言:sql
AI代码解释
复制
SET SESSION transaction_isolation='SERIALIZABLE';

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
KES数据库实践指南:探索KES数据库的事务隔离级别
前两篇文章我们详细讲解了如何安装KES金仓数据库,并提供了快速查询和搭建基于coze平台的智能体的解决方案。今天,我们的焦点将放在并发控制机制和事务隔离级别上。
努力的小雨
2024/06/30
1702
MySQL数据库——事务的操作(开启、回滚、提交)、特征、隔离级别基础总结
如果一个包含多个步骤的业务操作,被事务管理,那么这些操作要么同时成功,要么同时失败。如下A给B转钱的例子很形象的说明了事务的概念:
Winter_world
2020/09/25
20.9K0
MySQL数据库——事务的操作(开启、回滚、提交)、特征、隔离级别基础总结
数据库事务隔离级别
在并发的场景中,为了保证数据的一致性我们会在数据库中使用事务。然而在强一致性与性能上则需要根据具体业务来取舍,所以一般数据库提供了四种事务隔离级别: 读未提交(Read Uncommitted) 读提交(Read Committed) 可重复读(Repeatable Read) 序列化(Serializable) 由于日常工作中使用事务比较频繁,遂在此作一下总结 在了解这四种事务隔离级别之前,需要了解如下概念: 更新丢失(Lost Update): 两个事务同时修改一行数据,其中一个事务的更新被另外一个事
码农二狗
2018/06/29
5410
数据库四种隔离级别
隔离性是指,多个用户的并发事务访问同一个数据库时,一个用户的事务不应该被其他用户的事务干扰,多个并发事务之间要相互隔离。
全栈程序员站长
2022/07/21
5840
重新学习Mysql数据库8:MySQL的事务隔离级别实战
本文是微信公众号【Java技术江湖】的《重新学习MySQL数据库》其中一篇,本文部分内容来源于网络,为了把本文主题讲得清晰透彻,也整合了很多我认为不错的技术博客内容,引用其中了一些比较好的博客文章,如有侵权,请联系作者。
Java技术江湖
2019/11/29
5220
PG数据库事务隔离级别「建议收藏」
为了解决并发导致的不一致问题(脏读/不可重复读/幻读),SQL标准提出了四种事务隔离级别
全栈程序员站长
2022/11/07
1.2K0
数据库事务与隔离级别
事务(transaction)是数据库管理系统的执行单位,可以是一个数据库操作(如Select操作)或者是一组操作序列。事务ACID属性,即原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。 原子性:保证事务中的所有操作全部执行或全部不执行。例如执行转账事务,要么转账成功,要么失败。成功,则金额从转出帐户转入到目的帐户,并且两个帐户金额将发生相应的变化;失败,则两个账户的金额都不变。不会出现转出帐户扣了钱,而目的帐户没有收到钱的情况
java达人
2018/01/31
6390
数据库事务与隔离级别
在?MySQL事务隔离级别了解一下?
事务的四大ACID 属性:Atomicity 原子性、Consistency 一致性、Isolation 隔离性、Durability 持久性。
编程大道
2019/07/19
2410
MySQL中的事务隔离级别是什么,提供一个使用事务的实际案例
MySQL中的事务隔离级别是指在并发访问数据库时,事务之间相互隔离的程度。MySQL提供了四种标准的事务隔离级别,分别是读未提交(Read Uncommitted)、读已提交(Read Committed)、可重复读(Repeatable Read)和串行化(Serializable)。不同的隔离级别对于数据库的并发性、一致性和性能有不同的影响。
用户1289394
2024/06/11
1380
MySQL中的事务隔离级别是什么,提供一个使用事务的实际案例
数据库的事务作用及隔离级别
1、事务是什么? 实际的SQL执行过程中,有时候我们生产过程需要保证某些SQL要么一起并顺序执行成功,要么一起失败回滚,不做任何操作。那么就有了事务的概念。事务是数据库中保证交易可靠的机制。 2、事务的语句  a.开始事务:BEGIN TRANSACTION(这条语句之后的sql语句将处在一个事务当中,这些sql语句并不会立即执行)  b.提交事务:COMMIT TRANSACTION(一旦提交事务,事务中的所有sql语句才会执行)  c.回滚事务:ROLLBACK TRANSACTION(回滚事务,将之前
斯武丶风晴
2018/03/01
2.6K0
【MySQL】黑悟空都掌握的技能,数据库隔离级别全攻略
但狗哥作为搬砖编码小王子,认为基础内容必须掌握,不只为了应付面试,而是提升自己的必经道路
JavaDog程序狗
2024/09/14
5020
【MySQL】黑悟空都掌握的技能,数据库隔离级别全攻略
MySQL事务隔离级别
索引是MySQL的数据结构,关系着MySQL如何存储数据,查询数据;而如何操作数据,解决多线程时操作数据带来的问题,则需要通过事务来完成。
阿珍
2023/05/17
4310
MySQL 事务隔离级别[通俗易懂]
通过如下 SQL 可以查看数据库实例默认的全局隔离级别和当前 session 的隔离级别:
全栈程序员站长
2022/11/04
2.6K0
干了三年Java后端,你竟然还不知道MySQL的四大隔离级别?
之前分析一个死锁问题,发现自己对数据库隔离级别理解还不够清楚,所以趁着这几天假期,整理一下MySQL事务的四大隔离级别相关知识,希望对大家有帮助~
Java程序猿
2021/02/20
5190
MySQL隔离级别
(1)打开一个客户端A,并设置当前事务模式为read uncommitted(未提交读),查询表account的初始值:
林老师带你学编程
2019/05/25
1.9K0
数据库四大特性及数据库隔离级别
原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚。失败回滚的操作事务,将不能对事物有任何影响。
全栈程序员站长
2022/09/01
1.7K0
数据库四大特性及数据库隔离级别
一文彻底读懂MySQL事务的四大隔离级别
之前分析一个死锁问题,发现自己对数据库隔离级别理解还不够深入,所以趁着这几天假期,整理一下MySQL事务的四大隔离级别相关知识,希望对大家有帮助~
捡田螺的小男孩
2020/04/15
7.4K2
一文彻底读懂MySQL事务的四大隔离级别
MySQL的事务隔离级别 | 2023腾讯·技术创作特训营 第三期
不知道你有没有讲过这种场景,比如转账。正常情况下是一定要确保转出账户转出的金额,是正确累加到转入账户,任何一方的异常,都可判定这个交易是异常,这样的系统也是不可靠的。
Lemon黄
2023/11/18
3200
数据库事务的四大特性以及事务的隔离级别详解
java技术学习之道 每天分享各种技术文章 作者 : fjdingsd 来源 : 博客园 本篇讲诉数据库中事务的四大特性(ACID),并且将会详细地说明事务的隔离级别。 如果一个数据库声称支持事务的操作,那么该数据库必须要具备以下四个特性: ⑴ 原子性(Atomicity)   原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,这和前面两篇博客介绍事务的功能是一样的概念,因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响。 ⑵ 一致性(Consistency
Tanyboye
2018/07/02
3990
面试官:MySQL的事务隔离级别你了解吗?
如果觉得内容不错的话,希望大家可以帮忙点赞转发一波,这是对我最大的鼓励,感谢🙏🏻
小熊学Java
2023/07/16
1850
面试官:MySQL的事务隔离级别你了解吗?
推荐阅读
相关推荐
KES数据库实践指南:探索KES数据库的事务隔离级别
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文