TransactionScope 锁定 table 和 IsolationLevel

TransactionScope locking table and IsolationLevel

我想在我的项目中使用 TransactionScope。我阅读了它,发现它在数据库中创建了一个隐式事务。我想知道 TransactionScope 是否锁定了它操作的表?

例如在这段代码中:

using (Entities ent = new Entities())
{
    using (TransactionScope tran = Common.GetTransactionScope())
    {
        var oldRecords = ent.tblUser.Where(o => o.UserID == UserID);

        foreach (var item in oldRecords)
        {
           ent.tblUser.DeleteObject(item);
        }

public static TransactionScope GetTransactionScope()
{
    TransactionOptions transactionOptions = new TransactionOptions();
    transactionOptions.IsolationLevel = System.Transactions.IsolationLevel.Serializable;
    return new TransactionScope(TransactionScopeOption.Required, transactionOptions);
}

tblUser 是否锁定,直到 Complete 命令发出?

显式交易中IsolationLevel是否与隐式交易相似?

谢谢

SQL 服务器 进行锁定 - 如果需要的话。 任何 UPDATEDELETE 操作必须在它影响的那些行上获得 独占锁 - 如果那些已经被锁定另一笔交易,它不能那样做。

所以在你的情况下,如果你从数据库中删除了一些行,SQL服务器默认会锁定那些行 - 那些是被删除。它不会锁定整个 table。这是 除非 您一次删除大量行 - 如果您在单个事务中删除的行数超过 5'000 行,SQL 服务器将尝试进行 锁升级 并锁定整个 table(而不是保留和管理 5000 多个单独的行锁)。

隔离级别仅定义 reading 锁定行的时间 - 默认情况下 (READ COMMITTED),该行将有一个 shared 仅在读取时锁定 - 通常是非常非常短的时间。使用隔离级别REPEATABLE READ,共享锁会一直持有到当前事务结束,而SERIALIZABLE不仅会锁定正在读取的行, 但整个范围的行。但同样:only 影响 READ 操作 - 它对 DELETEUPDATE 语句没有直接影响(其他而不是在一行上使用共享锁可能会阻止 DELETE 获取它需要的独占锁)