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

时间:2015-03-02 15:58:44

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

研究隔离级别和阻塞,更具体的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&t 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);
...

谢谢。

1 个答案:

答案 0 :(得分:0)

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

开始交易

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

WAITFOR DELAY '03:00:00'

ROLLBACK TRANSACTION

在另一个我跑

设置事务隔离级别快照

开始交易

从dbo.x5中选择*(readcommitted)

第二次会议挂起。

如果我没有添加'readcommitted'提示它会读取(没有任何内容阻止快照隔离读取。)

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