从事务中创建的表中读取

Mad*_*ads 2 sql-server transaction isolation-level

我想查看正在进行事务的表中的数据。我将使用这个超级简单的临时表作为示例:

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)

在这种情况下,如果我尝试从表中读取数据,即使将隔离级别设置为读取未提交的数据,我也会再次陷入困境。

有什么方法可以从正在进行的事务中创建的表中读取数据吗?

Tib*_*szi 6

不,恐怕不是。创建表需要模式修改锁,该锁与任何内容都不兼容,甚至在执行未提交读时使用的模式稳定性锁也不兼容。

您很可能必须后退一步并重新考虑您的方法。即,在事务之前创建表。