研究隔离级别和阻塞,更具体的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);
...
谢谢。
答案 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之间的主要区别是默认锁定设置,但一旦设置它就会以相同的方式运行。