SQL事务的隔离级别

利用SQL Server创建事务及事务的隔离级别 事务及其隔离级别事务事务的特性定义事务事务隔离级别实验操作设计并执行一个复杂事务设计事务以比较不同隔离级别对事务的影响 事务 事务的特性 事务是作为单个逻辑工作单元执行的一些列操作。一个逻辑工作单元必须具有4个属性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)及持续性(Durability),简称ACID属性。 原子性:事务必须是原子工作单元,事务... 阅读详情

SQL4种隔离级别的定义

隔离级别的定义涉及到三种现象,读脏数据,不可重复读,幻读。定义来自postgresql的最新文档

dirty read  A transaction reads data written by a concurrent uncommitted transaction.
nonrepeatable read A transaction re-reads data it has previously read and finds that data has been modified by another transaction (that committed since the initial read).
phantom read A transaction re-executes a query returning a set of rows that satisfy a search condition and finds that the set of rows satisfying the condition has changed due to another recently-committed transaction.

The four transaction isolation levels and the corresponding behaviors are described in Table 13-1.

Isolation LevelDirty ReadNonrepeatable ReadPhantom Read| Read uncommitted | Possible | Possible | Possible |

Read committedNot possiblePossiblePossible
Repeatable readNot possibleNot possiblePossible
SerializableNot possibleNot possibleNot possible

下面我举例来说明这三种现象和4种隔离级别的区别。

==mytable==

id   age  name

1     20   zhang

2     22    li

3     23   wang

读脏数据

   事务A   select * from mytable where id=1   事务B update mytable set age=age+1 where id=1 rollback

   如果隔离级别是Read Uncommitted,那么A可能读到的age是21岁,虽然21这个值只是一个临时的值,事务B最终回归了它。

   如果能避免这种现象,那么隔离级别就至少是Read committed了。

不可重复读

  事务A select * from mytable where id=1  select * from mytable where id=1    事务B update mytable set age=age+1

   如果隔离级别不是Repeatable read,那么A第一次读的值可能是20,第二次变成了21

  如果能避免这种现象,那么隔离级别就至少是Repeatable read

幻读

  事务A select * from mytable where age<23  select * from mytable where age<23   事务B insert into mytable values(4, 21,'zhou')

  如果能避免这种现象就是Serializable。

  注意上面的例子,可重复读但不能幻读的情况:比如在基于锁的实现里,可能只锁定了age为20和22的行,但并没有锁定范围,那么可以插入age为21的新行,这是可以保证可重复读的。注意不可重复读和幻读的定义的文字细节:

    A transaction re-reads data it has previously read and finds that data has been modified by another transaction

    A transaction re-executes a query returning a set of rows that satisfy a search condition and finds that the set of rows satisfying the condition has changed due to another recently-committed transaction.

    很多资料没有把这两种分清楚。那上面的例子来说,A select * from mytable where age<23 这个query应该分为两步:首先找到age<23的记录,然后读取这些记录。

   可重复读指的是:我在同一个事务里两次读取这些记录的值是相同的,但它不能避免幻读,因为下次执行同一个查询时,满足条件的记录可能变多了。

   举个例子: 事务A select id from mytable where age<23  对于满足上面要求的id,找到这个id对应的name。

   这个例子在现实中不太可能发生,不过可以清楚的解释第二和第三中隔离级别的区别。这个事务其实就是找到年龄小于23的人的名字。

   如果只要满足第二种隔离级别,那么这个事务的结果就是我想要的结果。在这个事务的过程中,可能修改了zhang的名字,但是我拿到的还是zhang

   但是如果它不满足第三种隔离级别,那么可能再次执行这条语句会多出一个人来。而如果满足第三种隔离级别,那么select出来的结果是不变的。

   不过很多数据库系统的实现里都使用了比较强的实现,所以也不必特意强调它们的区别。

真正串行

   两个事务的结果和一个一个运行完全一样。具体的例子会在下面Postgresql的说明里提到。

   这个SQL 92 标准并没有定义,也就是说,即使是Serializable级别的,也可能不能保证这个要求,不过PostgreSQL是能够做到这点的。

PostgreSQL的隔离级别

   注意:我这里说的是最新开发版本9.1的情况,9.1之前的版本只能到Serializable级别的,而不能到“真正串行”的级别。

Read Committed Isolation Level

     这是PG的默认隔离级别,保证不会读到脏数据,PG认为这个级别能够满足一般的事务需求,而且非常高效。这种级别下,select只能看到执行前这一瞬间前提交的修改,在它执行过程中的提交是看不到的。(当然,它所在事务之前的修改即使未提交也是对它可见的)。如果这个select是update,delete等语句的条件,那么它select结果也是这样,如果在它修改的时候,发现有其它事务在做修改(那么这个事务至少删除或者锁定了某些对象,否则当前更新就在它之前),那么它会等其它事务完成,如果其它事务roll back了,它会继续更新;如果其它事务commit了,那么它会在其它事务的结果的基础上更新------如果前面的事务把它删除了,那么它就忽略这条记录;如果前面的事务修改了它,那么它会尝试从新判断这条记录是否满足条件。这是比较常见的,如果别的事务把记录修改了,那么原来满足条件的记录现在可能不满足了。

     比如银行转账的例子:

BEGIN;
UPDATE accounts SET balance = balance + 100.00 WHERE acctnum = 12345;
UPDATE accounts SET balance = balance - 100.00 WHERE acctnum = 7534;
COMMIT;

从账号7534转账100元到12345,这个事务先给12345加100元,然后给7534减100元。如果两个事务同时进行,那么后一个事务将会在前一个事务的基础上更新,这样就是我们需要的逻辑:给12345
加了200元而不是100元。

下面是另一个例子

BEGIN;
UPDATE website SET hits = hits + 1;
-- run from another session:  DELETE FROM website WHERE hits = 10;
COMMIT;

这个例子是两个事务,一个事务把hits加1;另一个事务删除hits==10的记录。

在这种隔离级别下,删除的事务其实是删除不了任何记录的。因为它的where选择hits==10的记录,因为是Read Committed级别,所以它只会找到在这瞬间hits==10的记录,这是前面的事务把hits==10的记录的hits改成了11了,它发现这点,然后重新用where的条件判断一下,发现不满足了,就什么也不做了。

Repeatable Read Isolation Level

    这个级别的select只能看到这个事务开始前提交的更改。可以这么理解:在开始事务时,给数据库拍个快照,然后所以的操作都在这个快照上进行;而上一个隔离级别呢,在select前个数据库拍个快照。注意:PG的这种实现方式不仅实现了Repeatable Read,而且同时实现了Serializable,这是合乎规范的,规范只是定义了每种隔离级别需要避免哪种现象。我们甚至可以只实现最高的一种隔离级别Serializable然后说自己实现了4种隔离级别。那SQL规范为什么还要定义这么多级别呢?因为实现的级别越高,效率也就越低,我的应用可能只需要较低级别的隔离,你用最高级别的隔离来实现,那么就效率太低了。说过极端的例子,我可以这样实现Serializable隔离级别------不允许事务并发执行,这必然避免了所有的情况,但是有什么意义呢?效率极低!

    其实最常用的隔离级别就是第二种和第四种,所以Oracle只实现了这两种(第一种就是没有隔离),所以不能理解为Oracle没有实现规范,它可以用第4中隔离级别来代替第3种(PostgreSQL也是这么做的),只不过有这样一种可能:有一种算法只实现了第三种级别没有实现第四种级别,它比第四种级别的高效,而没有实现它在某些应用场景下有点可惜!

   这个级别的update有所不同,如果它要修改的时候发现别人正在修改,那么它也会等待。如果别人rollback,它正常修改,如果别人commit,那么它就会失败,因为别人已经修改了,那么就不可重复读了,这个事务就得失败。失败后重新来一次,这是读到的数据已经是最新的了。

   失败的话会出现 ERROR: could not serialize access due to concurrent update

   因此,只有只读的Repeatable Read事务从来不会冲突,有写的事务时才可能冲突。

Note: Prior to PostgreSQL version 9.1, a request for the Serializable transaction isolation level provided exactly the same behavior described
here. To retain the legacy Serializable behavior, Repeatable Read should now be requested.

  注意:在9.1之前的版本,这个隔离级别就是最高级别了。

Serializable Isolation Level

   前面说了,PG9.1的Repeatable Read Level其实就满足SQL规范的Serializable级别了。那么这个级别是什么呢?

   我们先来看一个例子,看看Serializable和真正串行执行事务的区别。

   这个级别以及是SQL规范的最高级别了,但是它还是不能等价于真正的串行化(一个事务完成了另一个事务才能开始),比如下面的例子:

class | value
------+------
1 | 10
1 | 20
2 | 100
2 | 200
事务B:SELECT SUM(value) FROM mytab WHERE class = 1 把这个值以class=2插入

事务A:SELECT SUM(value) FROM mytab WHERE class = 2; 把这个值以class=1插入

先解释一下这个两个事务在干什么:多个事务协作计算这个表格value的值——事务A计算class=1的value和,事务B计算class=2,然后将结果以对方的class保持下来,一般对方可以方便的
求和。
如果以上面的隔离级别,也就是SQL规范的Serializable级别,那么两个事务都能提交,并且它们的结果都是300;而串行的结果呢?至少一个应该得到330

因此PG9.1的Serializable是真正的串行隔离级别,如果A插入(2,30),那么事务B的select或者insert都会出错,强迫回滚事务:

ERROR: could not serialize access due to read/write dependencies among transactions
这是用户再次重试事务B,它读到的就是330了。

这个级别需要使用谓词锁(Predicate Lock),它会锁定这个事务里用到过的记录,它会同时使用细粒度的tuple locks和粗粒度的page locks,并且不会造成block和死锁,但是它需要跟踪
事务用过的记录,所以还是比上一个级别慢的。另外如果是只读事务的话,那么它如果发现后面的逻辑不依赖于某些锁定的对象的话,它可能提前释放这些对象。所以知道自己不会修改,
那么最好告诉PG。

MySQL InnoDB的隔离级别

  To be continued.

SQL Server事务、隔离级别和并发问题解决      版权声明:本文为博主原创文章,未经博主允许不得转载。    首先,对于SqlServer的事务和隔离级别,与其他关系型数据库类似,事务是一个工作单元,可能包含查询和修改数据以及修改数据定义等多个活动。我们可以显式或隐式的定义事务边界。可以使用BEGIN TRAN或者BEGIN TRANSACTION语句显式的定义事务的开始。如果希望提交事务,可以使用COMMIT TRAN语句显式的定义事... 阅读详情

相关推荐

Multisim 14.0元件库下载权威指南:官方与社区资源

详解Multisim元件库下载的官方途径与可靠社区资源,帮助用户快速获取Multisim 14.0所需元件模型,提升电路仿真效率。

weixin_32925455的博客 747

4种SQL标准的事务隔离级别

(repeatable read):一个事务执行过程中看到的数据,总是跟这个事务在启动时看到的数据是一致的。当出现读写锁冲突的时候,后访问的事务必须等前一个事务执行完成,才能继续执行。(read uncommitted):一个事务还没提交时,它做的变更就能被别的事务看到。例子:假设数据表T中只有一列,其中一行的值为1,下面是按照时间顺序执行两个事务的行为。(read committed):一个事务提交之后,它做的变更才会被其他事务看到。所以从A的角度看, V1、V2值是1,V3的值是2。

魏波 2131

快速上手CH340N电路设计(CH340N USB转串口模块 USB Type-C接口 CH340系列芯片讲解)

一、上模块 二、功能分析 l 芯片:CH340N l 输入接口:USB、TYPE-C l 输出接口:TTL(5V\3.3V\GND\TX\RX) l 指示灯:电源、TX、RX 三、CH340x芯片 l CH340 是一个 USB 总线的转接芯片,实现 USB 转串口 l 全速 USB 设备接口,兼容 USB V2.0 l 硬件全双工串口,内置收发缓冲区,支持通讯波特率 50bps~2Mbps l 支持常用的 MODEM 联络信号 RTS、DTR、DCD、RI、DS...

东小东博客 5万+

SQL的四种隔离级别

SQL中的四种隔离级别 读未提交(Read uncommitted) The isolation level that provides the least amount of protection between transactions. Queries employ a locking strategy that allows them to proceed in situations...

CuteFruit的博客 1214

玩转Isaac Sim动态控制:从随机舞动到精准操控Franka的5种控制模式实测

本文深入实测了在NVIDIA Isaac Sim仿真平台中,利用Dynamic Control模块对Franka机械臂进行精准操控的五种核心模式:位置控制、单关节位置控制、速度控制、单关节速度控制和力矩控制。通过详细的代码示例和对比分析,阐述了每种模式的适用场景、参数调优技巧及从随机运动到闭环控制的实现路径,为机器人算法验证提供了实用指南。

night的博客 807

华为2024机考真题集合

2.中位数是指把一组数据从小到大排列,最中间的那个数,如果这组数据的个数是奇数,那最中间那个就是中位数,如果这组数据的个数为偶数,那就把中间的两个数之和除以 2,所得的结果就是中位数。在实际考试中会随机抽三道题目进行考察,其中两道100分卷题和一道200分卷题,总共400分。幼儿园组织活动,老师布置了一个任务:每个小朋友去了解与自己同一个小区的小朋友还有几个。3.查找整型数组中元素的众数并组成一个新的数组,求新数组的中位数。1.众数是指一组数据中出现次数量多的那个数,众数可以是多个。

qq_25360769的博客 5093

MySQL——SQL的事务隔离级别

文章目录MySQL——事务隔离级别1、数据并发问题2、SQL中四种隔离级别3、MySQL支持的隔离级别4、设置事务的隔离级别 MySQL——事务隔离级别 事务有隔离性的特性,理论上在某个事物对某个数据进行访问是,其他事务应该进行排队,当该事务提交后,其他事物才可以访问该数据。但是这样对性能影响太大。 1、数据并发问题 1、脏写(Dirty Write) 指一个事务修改了另外一个未提交事务修改过的数据。 Session A 和 Session B各开启了一个事务,Session B中的事务先将stude

万里顾一程的博客 1017

告别有线:用PVE直通无线网卡,打造一台真正的‘无线’Win10软路由/测试机

本文详细介绍了如何通过PVE直通无线网卡技术,构建全无线Win10软路由或测试机。从硬件选型、PVE环境配置到PCIe和USB双模直通技术,逐步指导实现Wi-Fi AP和蓝牙连接功能,为家庭实验室和小型办公环境提供灵活高效的网络解决方案。

weixin_28683689的博客 586

sql中的四种事务隔离级别

事务隔离级别 问题 同一个应用程序中的多个事务或不同应用程序中的多个事务在同一个数据集上并发执行时, 可能会出现许多意外的问题,这些问题可分为如下三种类型: 脏读(Dirty Read): 已知有两个事务A和B, A读取了已经被B更新但还没有被提交的数据,之后,B回滚事务,A读取的数据就是脏数据。 场景:公司发工资了,领导把5000元打到Tom的账号上,但是该事务并未提交,而Tom正好去查看账户,发现工资已经到账,账户多了5000元,非常高兴,可是不幸的是,领导发现发给Tom的工资金额不对,是2000元,

222222的博客 2655

LangGraph教程8:LangGraph流式处理

流式处理可显著提升基于LLM应用的响应性。LangGraph支持两种流式模式:values模式返回每一步的完整结果,适合需要完整上下文处理的场景;updates模式仅返回增量变化,适用于实时更新需求。示例代码展示了如何用create_react_agent实现这两种模式,其中values模式完整记录处理流程,updates模式逐步输出结果。通过异步迭代输出流,开发者可以灵活选择适合应用场景的流式处理方式。

Cachel Wood的博客 619

【技术科普】破解政务跨系统数据壁垒!亘川一网统管平台多源数据同步技术解析

本文解析亘川一网统管平台多源数据同步技术,针对政务跨系统数据壁垒难题,介绍组件的数据采集、校验、审计留痕等核心能力,结合营商环境项目落地案例,对比传统开发模式差异,讲解开源组件的实践价值,为政务项目开发者提供落地参考。

weixin_67440240的博客 634

SQLServer事务隔离级别

数据库中的事物是具有原子性(Atomicity),一致性(Consistemcy),隔离性(Isolation),持久性(Durability)四个特征。 1、原子性(Atomicity):事务中的全部操作在数据库中是不可分割的,要么全部完成,要么全部不执行。 2、一致性(Consistency):几个并行执行的事务,其执行结果必须与按某一顺序 串行执行的结果相一致。 3、夺隔离性(Isolation):事务的执行不受其他事务的干扰,事务执行的中间结果对其他事务必须是透明的。 4、夺持久性(Dura

coco的专栏 5563

购物车智能检测系统:YOLO26 + PyQt5 毕设实现

YOLO26 + PyQt5 完成购物车商品检测系统:标注数据集(OpenImages 筛选 + 自制 500 张),训练 100 epoch 得到 mAP50 约 0.89,集成商品定价后输出总价。建议先用 OpenImages 预训练权重在自制数据上调优(冻住 backbone 前 50 epoch),等 loss 稳定后再解冻全量训练。

m0_64661770的博客 55

一文弄懂SQL事务隔离级别

SQL事务隔离级别是数据库管理系统中用于控制并发事务访问数据的技术,旨在保证数据的一致性和完整性。隔离级别从低到高分为读未提交、读提交、可重复读和串行化。读未提交允许读取未提交的数据,可能导致脏读、不可重复读和幻读;读提交解决了脏读问题,但可能发生不可重复读和幻读;可重复读通过事务快照解决了脏读和不可重复读问题,但可能发生幻读;串行化则是最高隔离级别,通过串行执行读取操作解决了所有问题,但性能较差。选择合适的隔离级别需要根据具体业务需求和场景来决定,以平衡数据一致性和系统性能。

热爱C++和golang的学生 1165

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

SQL Server事务的隔离级别

事务的隔离级别 SQL Server通过在锁资源上使用不同类型的锁来隔离事务。为了开发安全的事务,定义事务内容以及应在何种情况下回滚至关重要,定义如何以及在多长时间内在事务中保持锁定也同等重要。这由隔离级别决定。应用不同的隔离级别,SQL Server赋予开发者一种能力,让他们为每一个单独事务定义与其他事务的隔离程度。事务隔离级别的定义如下: 是否在读数据的时候使用锁读锁持续多长时间

学无止境 1076

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

SQL Server事务隔离级别

SQL Server提供多种事务隔离级别,在数据一致性、并发性能和锁定开销之间权衡。标准ANSI级别包括:READ UNCOMMITTED(可能脏读)、READ COMMITTED(默认,避免脏读)、REPEATABLE READ(避免不可重复读)和SERIALIZABLE(最高隔离)。SQL Server特有扩展级别基于行版本控制:SNAPSHOT(事务级一致性)和READ COMMITTED SNAPSHOT(语句级一致性)。选择时需考虑应用场景,RCSI适合大多数情况,SNAPSHOT适合严格一致性要

HTTP404_CN的博客 1190

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

SQL事务隔离级别

我们在Hibernate的Environment.java文件中可以看到下面的注释: *  *   hibernate.connection.isolation *   JDBC transaction isolation level (only when using *     java.sql.DriverManager) *    *  这说明我们可以在hibernate.cfg.xml中配

【洪波@阿里云】 2281

SQL Server 事务隔离级别详解

标签: SQL SEERVER/MSSQL SERVER/SQL/事务隔离级别选项/设置数据库事务级别 SQL 事务隔离级别 概述 隔离级别用于决定如果控制并发用户如何读写数据的操作,同时对性能也有一定的影响作用。 步骤 事务隔离级别通过影响读操作来间接地影响写操作;可以在回话级别上设置事务隔离级别也可以在查询(表级别)级别上设置事务隔离级别。事务隔离级别总共有6个隔...

dengguawei0519的博客 172

mysql事务,隔离级别,sql优化

这里写目录标题mysql事务事务的四大特性隔离级别首先说说事务同时进行会出现的几种情况如何解决:设置隔离级别如果设置/查询mysql隔离级别:sql优化索引失效: mysql事务 事务的四大特性 1、原子性(Atomicity):最小单位,不可切割; 2、 一致性(Consistency):事务数据状态都是一致的,要么都成功,要么都失败,一条发生异常,集体回滚; 3、 隔离性(Isolation):事务和事务之间是互相隔离,互不干扰,一个事务的失败不影响其他事务的运行; 4、持久性(Durability):

laozengsky的博客 506

SQL Server 事务隔离级别的查看及更改

--查看SQL事务隔离级别 DBCC Useroptions --设置SQL事务隔离级别 set transaction isolation level Read Uncommitted set transaction isolation level <隔离级别> 测试代码 begin tran update T se...

945

Sql Server 事务隔离级别的查看及更改

根据自身 Sql Server 的情况来自定义 事务隔离级别,将会更加的满足需求,或提升性能。例如,对于逻辑简单的 Sql Server,完全可以使用 read uncommitted 模式,来减少死锁,减少堵塞, 提升性能和响应。对于此种应用场景应该是蛮多的,但是却没有一个全局设置,你妹呀! 这个功能真的很强大,但是不知道微软为什么把它的最大作用域定义为 当前链接,蛋疼,真的很蛋疼,没法全

zhll3377的专栏 1万+

Sql Server中的事务隔离级别

数据库中的事物有ACID(原子性,一致性,隔离性,持久性)四个特性。其中隔离性是用来处理并发执行的事务之间的数据访问控制。SqlServer中提供了几种不同级别的隔离类型。 概念           Read UnCommitted 当前事务可以读取其他事务已修改但还未提交的数据。如果其他事务进行数据Rollback,当前事务就会出现脏读,数据错误。 Read Committed...

Sinolife0605的博客 449

sql设置事务隔离级别

SET TRANSACTION一共有以下几种级别: SET TRANSACTION ISOLATION LEVEL { READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SNAPSHOT | SERIALIZABLE } 第一种情况: READ COMMITTED 这句的作

晖轩大师 980

标准SQL事务隔离级别与Mysql事务隔离级别的区别与实现

标准SQL的事务隔离级别 事务隔离级别 脏读 不可重复读 幻读 读未提交(read-uncommitted) 是 是 是 不可重复读(read-committed) 否 是 是 可重复读(repeatable-read) 否 否 是 串行化(serializable) 否 否 否 Mysql 的事务隔离级别 事务隔离级别 脏读 不可重复读 幻读 ...

qq_36431213的博客 505

SQL 事务隔离级别与并发控制

事务隔离级别定义了多个事务并发执行时,一个事务对另一个事务的影响程度。不同的隔离级别提供了不同程度的并发保护和性能权衡。SQL 事务隔离级别和并发控制是数据库管理系统中非常重要的概念。它们不仅影响数据的一致性,还直接影响系统的性能和可扩展性。了解这些概念有助于开发者更好地设计和优化数据库应用。希望本文能帮助你理解 SQL 事务隔离级别及其在并发控制中的作用。如果你有任何疑问或需要进一步的信息,请随时联系我!```

2501_91226935的博客 967
上一篇: pgAdmin在打开查询构造工具(Query Builder)时死掉的解决办法
下一篇: build qt webkit with vs2008 in windows
fancyerII
博客等级 码龄23年 48粉丝 164原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值