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语句显式的定义事... 阅读详情

相关推荐

Fast DDS源代码走读

DDS, PDP, EPD, DataWriter, DataReader

weixin_43082062的博客 713

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

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

魏波 2131

Mplus—验证性因素分析(Confirmatory Factor Analysis, CFA)

介绍一阶和二阶验证性因素分析概况及在Mplus中的操作方法。

m0_54401011的博客 1万+

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

DESeq2实战:如何用LRT检验分析基因表达随时间变化的模式(附完整代码)

本文详细介绍了如何使用DESeq2中的LRT检验分析基因表达随时间变化的模式,包括实验设计、数据预处理、模型构建、结果提取与可视化等完整流程。通过实战案例和完整代码,帮助生物信息学研究者掌握时间序列RNA-seq分析的核心技术,特别适合需要快速上手的实践者。

weixin_42620255的博客 466

QCC5125/QCC5144----LDAC 44.1K 48K 96K 192K 输出

QCC5125/QCC5144----LDAC 44.1K 48K 96K 192K 输出。而且还不需要license限制。

Alex_886的博客 1975

MySQL——SQL的事务隔离级别

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

万里顾一程的博客 1017

Simulink中Simscape—Fluids模块(原Simhydraulics)学习记录

学习来源:http://cn.mathworks.com/help/physmod/hydro/getting-started-with-simhydraulics.html 主要学习内容如下图: 详细内容: 1、组件来源 SIMULINK浏览器中的模块:Simscape_Foundation 和 Simscape_Fluids。 2、Simscape下包括多个子

1万+

sql中的四种事务隔离级别

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

222222的博客 2655

2026年数学建模国赛B题无线电干扰源的快速自动定位与清除 论文详细解析

数学建模竞赛论文无线电干扰源的快速自动定位与清除2026 年高教社杯全国大学生数学建模竞赛 B 题完整求解论文交会定位、极大极小测点优化、自适应多频道搜索与定向源恢复的统一建模模型、算法、代码、图表与验证一体化交付本文研究圆形目标区域中多个未知无线电干扰源的快速检测、定位与清除问题,建立了由误差楔交会模型、角度观测信息模型、分层勘测模型、鲁棒射线交会模型和定向覆盖反馈模型组成的统一求解框架。模型同时覆盖题目中的四个子问题:多测向射线形成的多边形定位区域及直径、第二个测点的极大极小优选、全向源自动搜索清除策略

YOLO 357

完整复盘【避雷jd文职某岗位】潍坊青州hhj(据说未来搬到天津),助理实验师岗位,三人进面,面试全部不及格,空头岗位!像这种情况,该单位很多 | 附个人完整备考背诵题目 | 世间一场梦,不会再考这个了

本文以博主本人报考jun dui文职,从报考、备考、考试、查成绩到资格审查、面试,全程亲身经历,给想要报考该内容的朋友们一些小的参考。祝你顺利上岸!完整复盘【避雷jd文职某岗位】潍坊青州hhj(据说未来搬到天津),助理实验师岗位,三人进面,面试全部不及格,空头岗位!像这种情况,该单位很多 | 附个人完整备考背诵题目 | 世间一场梦,不会再考这个了

追光者♂:记录、分享、总结、提升,现象级专栏《Python从入门到人工智能》作者,无惧黑暗,坚信曙光 245

SQLServer事务隔离级别

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

coco的专栏 5563

在blender中安装vtk插件

Blender 是一个开源的、功能强大的3D计算机图形软件,广泛用于创建动画片、视觉效果、艺术作品、3D打印模型、互动3D应用程序和视频游戏。Blender 是由 Blender 基金会开发和维护的,具有丰富的功能和灵活的扩展性。在github上下载zip插件。

如果想成为中心,那么就到中心去吧。 294

一文弄懂SQL事务隔离级别

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

热爱C++和golang的学生 1165

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

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

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

SQL Server事务的隔离级别

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

学无止境 1076

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

SQL Server事务隔离级别

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

HTTP404_CN的博客 1190

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

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、付费专栏及课程。

余额充值