【问题标题】:TransactionScope locking table and IsolationLevelTransactionScope 锁定表和 IsolationLevel
【发布时间】:2015-11-01 07:55:41
【问题描述】:

我想在我的项目中使用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-server entity-framework c#-4.0 transactions transactionscope


    【解决方案1】:

    SQL Server 执行锁定 - 如果需要。 任何 UPDATEDELETE 操作必须在它影响的那些行上获得一个排他锁 - 如果这些行已经被另一个事务锁定,它不能这样做。

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

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

    【讨论】:

    • 不错的答案。上面代码中的@marc_s 如果我用ID=1 删除记录并且在那一刻另一个线程想要读取ID=1 发生了什么?你说我应该得到独占锁但TransactionScope得到隐式锁?
    • 如果你的DELETE事务获得了排他锁,其他事务就无法读取这一行——它将被锁定,并且可能超时
    猜你喜欢
    • 1970-01-01
    • 2011-04-07
    • 1970-01-01
    • 1970-01-01
    • 2013-10-06
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多