我想查看正在进行事务的表中的数据。我将以这个超级简单的临时表为例:
SELECT 5 AS NUMBER INTO ##temptable
我将创建一个事务来插入一个编号为 10 的新行:
BEGIN TRAN;
INSERT INTO ##temptable
SELECT 10 AS Number
WAITFOR DELAY '00:00:20';
COMMIT TRAN;
现在,如果我打开一个新查询并执行常规选择语句,我将不会得到任何结果,轮子将一直旋转,直到事务提交。我可以改为将隔离级别设置为已提交读:
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
我希望这会返回承诺的数字 5,而不是未承诺的数字 10,但我再次得到一个纺车。我想这不是它的工作原理。
如果我将隔离级别设置为未提交:
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
这成功地从表中返回两个数字。
我仍然有一个问题,因为我想像这样在事务内部创建表:
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
BEGIN TRAN;
SELECT 5 AS NUMBER INTO ##temptable
INSERT INTO ##temptable
SELECT 10 AS Number
WAITFOR DELAY '00:00:20';
COMMIT TRAN;
在这种情况下,如果我尝试从表中读取,即使隔离级别设置为未提交,我也会再次得到一个旋转的轮子。
有没有办法从正在进行的事务中创建的表中读取?
不,恐怕不会。创建一个表需要一个模式修改锁,它不兼容任何东西,甚至不需要在读取未提交时使用的模式稳定性锁。
你很可能不得不退后一步,重新考虑你的方法。即,在事务之前创建表。