【问题标题】:Transaction Isolation Levels - Table Locking in Azure SQL Database事务隔离级别 - Azure SQL 数据库中的表锁定
【发布时间】:2015-05-03 01:25:03
【问题描述】:

研究隔离级别和阻塞,更具体的 READ COMMITTED 与 READ COMMITTED SNAPSHOT。

在 SQL Server 2014 中,默认隔离级别是 READ COMMITTED,如果我运行

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.Person 读取并等待 TABLOCKX + HOLDLOCK'ed tx。

问题:如何重现阻塞场景,可能带有提示,强制第一个 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);
...

谢谢。

【问题讨论】:

    标签: sql sql-server azure transactions isolation-level


    【解决方案1】:

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

    开始交易

    SELECT top 1 * FROM dbo.x5 WITH (TABLOCKX, HOLDLOCK);

    等待延迟'03:00:00'

    回滚交易

    另一个我跑

    设置事务隔离级别快照

    开始交易

    select * from dbo.x5 with (readcommitted)

    第二个会话挂起。

    如果我不添加它读取的“已提交”提示(没有阻止快照隔离读取。)

    根据文献,Azure 和非 Azure 之间的主要区别在于默认锁定设置,但一旦设置,其作用方式相同。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-27
      • 1970-01-01
      • 2014-03-23
      • 2019-03-16
      相关资源
      最近更新 更多