我想查看正在进行事务的表中的数据。我将使用这个超级简单的临时表作为示例:
SELECT 5 AS NUMBER INTO ##temptable
Run Code Online (Sandbox Code Playgroud)
我将创建一个事务来插入数字为 10 的新行:
BEGIN TRAN;
INSERT INTO ##temptable
SELECT 10 AS Number
WAITFOR DELAY '00:00:20';
COMMIT TRAN;
Run Code Online (Sandbox Code Playgroud)
现在,如果我打开一个新查询,并执行常规 select 语句,我将不会得到任何结果,轮子将一直旋转,直到事务提交。我可以将隔离级别设置为已提交读:
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
Run Code Online (Sandbox Code Playgroud)
我希望这会返回已提交的数字 5,但不会返回未提交的数字 10,但我再次得到一个旋转轮。我想事情并不是这样的。
如果我将隔离级别设置为读取未提交:
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
Run Code Online (Sandbox Code Playgroud)
这成功地从表中返回两个数字。
但我仍然有一个问题,因为我想在事务内部创建表,如下所示:
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;
Run Code Online (Sandbox Code Playgroud)
在这种情况下,如果我尝试从表中读取数据,即使将隔离级别设置为读取未提交的数据,我也会再次陷入困境。
有什么方法可以从正在进行的事务中创建的表中读取数据吗?