TRUNCATE TABLE 会影响 Sql Server 中的隔离级别吗?

Aka*_* KC 1 sql-server transaction truncate isolation-level

因为我正在处理将 SQL SERVER 作为数据库的项目......我在我的项目中维护隔离级别,我为我的项目启用了快照隔离级别......

由于我必须进行一些脏读,我正在使用设置查询它。我已经SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED.在存储过程中实现了它......这是我存储过程的简短版本

ALTER PROCEDURE [dbo].[proc_ReadDirtyData]
@id INT,
@mode VARCHAR(5)

AS
BEGIN
    --Read Dirty Data
    IF (@mode = 'RDD')
    BEGIN
            SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
            SELECT * FROM tbl_transaction
            WHERE id = @id;--@id foreign key in tbl_transaction.
                           --This read has been done during the transaction from C# Apps
    END
END
Run Code Online (Sandbox Code Playgroud)

在我的 C# 应用程序中,保持以下结构

snapshot transaction start

stage1 : tblmaster --generates id
stage2 :tblchild --inserts the data with above id as foreign key.After successfull inserting,
          --dirty read goes here applying where equal to above id for other operation

if(operationSuccessful)
{
     transactionCommit()
}
else
{
     transactionRollback();
}

snapshot transaction end
Run Code Online (Sandbox Code Playgroud)

在操作表上进行 TRUNCATE 操作后,我在 stage2 中遇到问题...

我一直在检查它是否进行了正确的脏读,所以我用来清除发生脏读的特定表的数据......

但是,当我TRUNCATE用于清除表数据时,问题就出现了......如果我使用TRUNCATE,我不能像使用一样进行脏读DELETE,它非常适合脏读......

在这里,我想明确一点,我不会在 TRUNCATE/DELETE 操作期间进行脏读……仅在 TRUNCATE/DELETE 操作之后,我会进行新数据的脏读……

现在,我很好奇是否TRUNCATE会影响该表的内部隔离....

Mar*_*ith 11

TRUNCATEtable 将SCH-M在 table 上锁定。

即使在READ UNCOMMITTED级别上,SELECT查询也需要SCH-S锁定。在TRUNCATE事务结束并且冲突SCH-M锁被释放之前,这是不可能的。

  • @LolCoder - `DELETE` 不会在表上使用 `SCH-M` 锁。它将在行、页、范围甚至整个对象上使用“X”锁。这与读取所需的“SCH-S”锁不冲突。唯一阻止“SCH-S”的是“SCH-M”。请参阅 [锁定兼容性矩阵](http://msdn.microsoft.com/en-gb/library/ms186396(v=sql.105).aspx) (2认同)