理解事务的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。==
相关文章
|
10月前
|
缓存 自然语言处理 安全
TikTokitem_search_video关键词视频列表接口对接全攻略:从入门到精通
TikTok item_search_video接口支持按关键词、地区、时间等多维度批量检索全球视频,返回互动数据、创作者信息及商品标签,适用于跨境内容聚合、爆款挖掘与舆情监测。本攻略涵盖权限获取、对接调试到生产优化的全流程,助力开发者高效稳定接入。
|
Go Java
mockito中两种部分mock的实现,spy、callRealMethod
什么是类的部分mock(partial mock)?A:部分mock是说一个类的方法有些是实际调用,有些是使用mockito的stubbing(桩实现)。   为什么需要部分mock? A:当需要测试一个组合方法(一个方法需要其它多个方法协作)的时候,某个叶子方法(只供别人调用,自己不依赖其它反复)已经被测试过,我们其实不需要再次测试这个叶子方法,so,让叶子打桩实现返回结果,上层方法实际调用并测试。
5508 1
|
存储 Linux Go
如何在Github上Pull Request的教程
关于如何在GitHub上发起Pull Request(合并请求)的详细教程,包括Fork(分支)、Clone(克隆)、创建新分支、修改代码、提交更改、推送到远程仓库等步骤,并提供了解决权限问题的方法,如创建个人访问令牌(Personal Access Token)。
1154 6
|
机器学习/深度学习 人工智能 自然语言处理
注意力机制详解(一)
注意力机制是受人类认知过程启发的一种深度学习技术,它允许模型动态地聚焦于输入的不同部分,根据上下文分配“注意力”。这种机制最早在序列到序列模型中提出,解决了长距离依赖问题,增强了模型理解和处理复杂数据的能力。基本的注意力计算涉及查询(Q)、键(K)和值(V),通过不同方式(如点积、拼接等)计算相关性并应用softmax归一化,得到注意力权重,最后加权组合值向量得到输出。自注意力是注意力机制的一种形式,其中Q、K和V通常是相同的。在自然语言处理(NLP)中,注意力机制广泛应用在Transformer和预训练模型如BERT中,显著提升了模型的表现。
|
网络协议 网络架构
【第三期】计算机网络常识/网络分层模型与数据包封装传输过程
【第三期】计算机网络常识/网络分层模型与数据包封装传输过程
807 0
|
Web App开发 网络安全
HDFS的WEB页面访问常见问题
HDFS的WEB UI管理页面 50070 端口 无法访问解决办法! 本文基于HADOOP-3..1.0,Cecntos7.0环境下进行测试,所以遇到很多新鲜的问题; 特别注意:HaDoop3.0之前web访问端口是50070   hadoop3.0之后web访问端口为9870 学习建议:倘若按照多数人的配置进行配置且配置语法没有问题,遇到错误时,尽量不要先进行配置的更改,先考虑其他客观因素,比如防火墙、SELinux等等      另外尤其要注意版本问题。
4186 0
|
网络协议 Linux
Linux 的端口区间
在 Linux 中,端口区间分配和使用如下: 1. 0到1023端口是系统保留的端口,由一些通用协议、应用程序及其服务使用。这些端口被标识为众所周知的端口,并且不能被用户程序使用。 2. 1024到49151端口是为用户程序保留的,通常也称为注册端口。这些端口须先在IANA(互联网号码分配局)注册,以避免端口冲突。在进行应用程序开发时,应尽可能分配一个注册端口。 3. 49152到65535端口是为临时使用而保留的。这个端口范围通常用于不需要长期占据端口的应用程序,例如下载和文件共享应用程序。 至于如何使用这些端口区间,这取决于应用程序的设计和功能。例如,FTP服务器的默认控制连接端口为1
1622 0
|
存储 前端开发 JavaScript
前后端分离模式开发的BS电子病历编辑器源码(Java)
前后端分离模式开发的BS电子病历编辑器源码(Java)
553 1
|
程序员 Python
带你用Python浪漫情人节(附源码)
Python情人节的那些骚操作。
带你用Python浪漫情人节(附源码)
|
XML Java 数据库
详解事务的7种传播行为
什么是Spring事务的传播行为?事务传播行为的七种类型有哪些?将异常try-catch捕获,事务是否还会回滚?
933 0
详解事务的7种传播行为

热门文章

最新文章