理解事务的4种隔离级别

简介: 数据库事务的隔离级别有4种,由低到高分别为`Read uncommitted 、Read committed 、Repeatable read 、Serializable `。而且,在事务的并发操作中可能会出现脏读,不可重复读,幻读。本文将通过事例一一阐述它们的概念与联系。

个人博客:
blog.marschariot.com

转自:https://blog.csdn.net/qq_33290787/article/details/51924963

数据库事务的隔离级别有4种,由低到高分别为Read uncommitted 、Read committed 、Repeatable read 、Serializable 。而且,在事务的并发操作中可能会出现脏读,不可重复读,幻读。下面通过事例一一阐述它们的概念与联系。


Read uncommitted

读未提交,顾名思义,就是一个事务可以读取另一个未提交事务的数据。

事例:老板要给程序员发工资,程序员的工资是3.6万/月。但是发工资时老板不小心按错了数字,按成3.9万/月,该钱已经打到程序员的户口,但是事务还没有提交,就在这时,程序员去查看自己这个月的工资,发现比往常多了3千元,以为涨工资了非常高兴。但是老板及时发现了不对,马上回滚差点就提交了的事务,将数字改成3.6万再提交。

分析:实际程序员这个月的工资还是3.6万,但是程序员看到的是3.9万。他看到的是老板还没提交事务时的数据。这就是==脏读==。


  • 那怎么解决脏读呢?Read committed!读提交,能解决脏读问题。

Read committed

读提交,顾名思义,就是一个事务要等另一个事务提交后才能读取数据。

事例:程序员拿着信用卡去享受生活(卡里当然是只有3.6万),当他埋单时(程序员事务开启),收费系统事先检测到他的卡里有3.6万,就在这个时候!!程序员的妻子要把钱全部转出充当家用,并提交。当收费系统准备扣款时,再检测卡里的金额,发现已经没钱了(==第二次检测金额当然要等待妻子转出金额事务提交完==)。程序员就会很郁闷,明明卡里是有钱的…

分析:这就是读提交,若有事务对数据进行更新(UPDATE)操作时,读操作事务要等待这个更新操作事务提交后才能读取数据,可以解决脏读问题。但在这个事例中,出现了==一个事务范围内两个相同的查询却返回了不同数据,这就是不可重复读。==


  • 那怎么解决可能的不可重复读问题?Repeatable read !

Repeatable read

重复读,就是在开始读取数据(事务开启)时,不再允许修改操作

事例:程序员拿着信用卡去享受生活(卡里当然是只有3.6万),当他埋单时(==事务开启,不允许其他事务的UPDATE修改操作==),收费系统事先检测到他的卡里有3.6万。这个时候他的妻子不能转出金额了。接下来收费系统就可以扣款了。

分析:重复读可以解决不可重复读问题。写到这里,应该明白的一点就是,==不可重复读对应的是修改,即UPDATE操作==。但是可能还会有==幻读==问题。因为==幻读问题对应的是插入INSERT操作,而不是UPDATE操作。==


  • 什么时候会出现幻读?

事例:程序员某一天去消费,花了2千元,然后他的妻子去查看他今天的消费记录(全表扫描FTS,妻子事务开启),看到确实是花了2千元,就在这个时候,程序员花了1万买了一部电脑,即==新增INSERT==了一条消费记录,并提交。当妻子打印程序员的消费记录清单时(妻子事务提交),发现花了1.2万元,似乎出现了幻觉,这就是幻读。


  • 那怎么解决幻读问题?Serializable!

Serializable 序列化

Serializable 是最高的事务隔离级别,在该级别下,事务==串行化顺序执行==,可以避免脏读、不可重复读与幻读。但是这种事务隔离级别效率低下,比较耗数据库性能,一般不使用。



==值得一提的是:大多数数据库默认的事务隔离级别是Read committed,比如Sql Server , Oracle。Mysql的默认隔离级别是Repeatable read。==
相关文章
|
索引 Python
全解析!9个处理Excel的Python库,到底哪个最好用?
全解析!9个处理Excel的Python库,到底哪个最好用?
7226 1
全解析!9个处理Excel的Python库,到底哪个最好用?
|
8月前
|
缓存 自然语言处理 安全
TikTokitem_search_video关键词视频列表接口对接全攻略:从入门到精通
TikTok item_search_video接口支持按关键词、地区、时间等多维度批量检索全球视频,返回互动数据、创作者信息及商品标签,适用于跨境内容聚合、爆款挖掘与舆情监测。本攻略涵盖权限获取、对接调试到生产优化的全流程,助力开发者高效稳定接入。
|
机器学习/深度学习 人工智能 Java
Java机器学习实战:基于DJL框架的手写数字识别全解析
在人工智能蓬勃发展的今天,Python凭借丰富的生态库(如TensorFlow、PyTorch)成为AI开发的首选语言。但Java作为企业级应用的基石,其在生产环境部署、性能优化和工程化方面的优势不容忽视。DJL(Deep Java Library)的出现完美填补了Java在深度学习领域的空白,它提供了一套统一的API,允许开发者无缝对接主流深度学习框架,将AI模型高效部署到Java生态中。本文将通过手写数字识别的完整流程,深入解析DJL框架的核心机制与应用实践。
1018 3
|
存储 Linux Go
如何在Github上Pull Request的教程
关于如何在GitHub上发起Pull Request(合并请求)的详细教程,包括Fork(分支)、Clone(克隆)、创建新分支、修改代码、提交更改、推送到远程仓库等步骤,并提供了解决权限问题的方法,如创建个人访问令牌(Personal Access Token)。
1097 6
|
Go Java
mockito中两种部分mock的实现,spy、callRealMethod
什么是类的部分mock(partial mock)?A:部分mock是说一个类的方法有些是实际调用,有些是使用mockito的stubbing(桩实现)。   为什么需要部分mock? A:当需要测试一个组合方法(一个方法需要其它多个方法协作)的时候,某个叶子方法(只供别人调用,自己不依赖其它反复)已经被测试过,我们其实不需要再次测试这个叶子方法,so,让叶子打桩实现返回结果,上层方法实际调用并测试。
5461 1
|
机器学习/深度学习 人工智能 自然语言处理
注意力机制详解(一)
注意力机制是受人类认知过程启发的一种深度学习技术,它允许模型动态地聚焦于输入的不同部分,根据上下文分配“注意力”。这种机制最早在序列到序列模型中提出,解决了长距离依赖问题,增强了模型理解和处理复杂数据的能力。基本的注意力计算涉及查询(Q)、键(K)和值(V),通过不同方式(如点积、拼接等)计算相关性并应用softmax归一化,得到注意力权重,最后加权组合值向量得到输出。自注意力是注意力机制的一种形式,其中Q、K和V通常是相同的。在自然语言处理(NLP)中,注意力机制广泛应用在Transformer和预训练模型如BERT中,显著提升了模型的表现。
|
SQL 关系型数据库 MySQL
MySQL in 太慢的 3 种优化方案
MySQL中的`eq_range_index_dive_limit`参数默认值为200,影响了IN查询的执行方式。当IN列表项少于这个值时,MySQL会使用扫描索引树(精确成本计算),而多于此值则使用索引统计(快速但可能不准)来分析查询成本。大量IN值可能导致性能下降。解决方案包括:1) 分批查询;2) 使用UNION ALL创建内存临时表;3) 创建实体表存储IN值并进行JOIN操作。注意,实体表需及时清理并避免反复插入删除导致性能下降。
3387 0
|
网络协议 Linux
Linux 的端口区间
在 Linux 中,端口区间分配和使用如下: 1. 0到1023端口是系统保留的端口,由一些通用协议、应用程序及其服务使用。这些端口被标识为众所周知的端口,并且不能被用户程序使用。 2. 1024到49151端口是为用户程序保留的,通常也称为注册端口。这些端口须先在IANA(互联网号码分配局)注册,以避免端口冲突。在进行应用程序开发时,应尽可能分配一个注册端口。 3. 49152到65535端口是为临时使用而保留的。这个端口范围通常用于不需要长期占据端口的应用程序,例如下载和文件共享应用程序。 至于如何使用这些端口区间,这取决于应用程序的设计和功能。例如,FTP服务器的默认控制连接端口为1
1545 0
|
资源调度 数据可视化 前端开发
基于mathlive从零将公式编辑器集成到可视化搭建平台
基于mathlive从零将公式编辑器集成到可视化搭建平台
678 0
|
存储 SQL 缓存
【MySQL数据库原理 零】MySQL数据库原理看这一篇就够了(一)
【MySQL数据库原理 零】MySQL数据库原理看这一篇就够了(一)
813 1

热门文章

最新文章