TransactionScope锁定表和IsolationLevel

时间:2015-11-01 07:55:41

标签: sql-server entity-framework c#-4.0 transactions transactionscope

我想在我的项目中使用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是否与隐式事务类似?

由于

1 个答案:

答案 0 :(得分:10)

执行锁定的 SQL Server - 如果需要的话。 任何 UPDATEDELETE操作必须在其影响的行上获得独占锁 - 如果这些行已被其他交易锁定,则无法执行这一点。

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

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