当前位置: 首页 > 知识库问答 >
问题:

事务隔离级别-Azure SQL数据库中的表锁定

呼延弘方
2023-03-14

研究隔离级别和阻塞,更具体的读提交与读提交快照。

在SQL Server 2014中,默认隔离级别是提交读取,如果我运行

BEGIN TRANSACTION
SELECT top 1 * FROM Person.Person WITH (TABLOCKX, HOLDLOCK);
WAITFOR DELAY '03:00:00'
ROLLBACK TRANSACTION

然后在新的连接中

SELECT * FROM Person.Person

第二个查询将阻塞并挂起。

然而,在Azure SQL中,隔离级别是READ COMMITTED SNAPSHOT,它似乎允许从Person读取。持TABLOCKX的人在等待。

问:如何重现阻塞场景,可能有提示,强制第一个SELECT完全阻塞表,同时打开READ COMMITTED SNAPSHOT?-因为它在Azure SQL中,不能更改。

我尝试过:

SET TRANSACTION ISOLATION LEVEL READ COMMITTED
SELECT top 1 * FROM Person.Person WITH (TABLOCKX, HOLDLOCK);
BEGIN TRANSACTION
...

BEGIN TRANSACTION
SELECT top 1 * FROM Person.Person WITH (READCOMMITTED);
...

谢谢。

共有1个答案

平学
2023-03-14

我无法重现你描述的情况。当我打开隔离级别以在常规(2012 年非 Azure SQL Server DB)中快照时,如下所示:设置allow_snapshot_isolation并创建一个表 dbo.x5 并填充它。在一个会话中,我运行:

开始交易

使用(TABLOCKX, HOLDLOCK)从dbo. x5中选择顶部1*;

等待延迟 '03:00:00'

回滚事务

另一只手里我在奔跑

设置事务隔离级别快照

开始交易

从 dbo.x5 中选择 *,并带有(已读取)

第二个会话挂起。

如果我不添加“readcommitted”提示,它会读取(没有什么会阻止快照隔离读取。

根据文献,Azure和非Azure之间的主要区别是默认的锁定设置,但一旦设置,它的行为是相同的。

 类似资料:
  • 主要内容:事务概述,事务的四大特性,并发事务问题,事务的隔离级别,演示:,总结事务概述 事务是一个或一组sql语句组成的一个执行单元,这个执行单元要么全部执行成功,要么全部执行失败。用于保证数据的完整性。 如账户转账,张三给李四转500,对应的sql语句应该是update张三的 余额-500,并且update李四的余额+500,如果先更新完张三的数据,然后出现了异常,导致李四的余额修改不了,那么就出现数据上的问题了,应该使用事务来解决这一问题,当中间出现异常后回滚,让张三的

  • JPA锁(乐观/悲观)和数据库隔离级别(以http://www . PostgreSQL . org/docs/9.1/static/transaction-iso . html为例)之间有没有相互影响? EJB3.2规范(8.3.2“隔离级别”)说Bean提供者负责设置事务的隔离级别,所以一般情况下我应该不会在意,但无论如何我还是很困惑。在PostgreSQL的示例中,根据提到的来源,默认隔离级

  • 我已经阅读了大约4个级别的隔离: 我想了解每个事务隔离在表上使用的锁 以下是事务隔离中可能出现的三种现象 脏读取-无锁定 不可重复读取-无脏读取作为对提交数据的锁定 幻影读取-锁定sql块(使用select query选择) 我想了解我们在哪里定义这些隔离级别:仅在jdbc/hibernate级别或在DB中定义 PS:我已经浏览了oracle中隔离级别的链接,但是它们看起来很笨拙,而且只针对数据库

  • 我试图理解锁定如何与隔离级别一起工作。我已经回答了这个问题,但无法理解给定打击的流 在这里,我在不同的终端中启动两个事务,并在其中读取同一行。当我尝试更新它们时,两个终端都在等待更新。除此之外,没有其他查询正在运行 这是我做的一系列步骤 这是我的第一个问题 这里我想了解为什么两个连接都在等待,以及它们是否是谁拥有更新行的锁? 如果我将上述步骤更改为 在这种情况下,不同的是我可以看到conn1有锁,

  • 我对交易和隔离级别有一些疑问: 1) 如果DB事务级别设置为Serializable/RepeatableRead,并且有两个并发事务试图修改同一数据,则其中一个事务将失败。 在这种情况下,为什么DB不重试失败的操作?在应用程序级别重试事务是否是一个好的做法(希望另一个事务将在同一时间结束)? 2)如果数据库事务级别设置为READ_COMMITTED/DIRTY READ,并且有两个并发事务试图修

  • 本文向大家介绍事务的隔离级别有哪些?相关面试题,主要包含被问及事务的隔离级别有哪些?时的应答技巧和注意事项,需要的朋友参考一下 SQL 标准定义了四个隔离级别: READ-UNCOMMITTED(读取未提交): 最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读。 READ-COMMITTED(读取已提交): 允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重