我想在我的项目中使用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
是否与隐式事务类似?
由于
答案 0 :(得分:10)
执行锁定的 SQL Server - 如果需要的话。 任何 UPDATE
或DELETE
操作必须在其影响的行上获得独占锁 - 如果这些行已被其他交易锁定,则无法执行这一点。
因此,在您的情况下,如果您从数据库中删除了许多行,则默认情况下SQL Server将仅锁定那些行 - 正在删除的行。它不会锁定整个表格。这是,除非一次删除大量行 - 如果您在单个事务中删除了更多 5' 000 行,SQL Server将尝试执行此操作锁定升级并锁定整个表格(而不是保留和管理5000多个单独的行锁定。)
隔离级别仅定义读取将锁定行的时间长度 - 默认情况下(READ COMMITTED
),该行只有共享锁定它被阅读的时间 - 通常是非常短的时间。隔离级别 REPEATABLE READ ,共享锁将保持到当前事务结束, SERIALIZABLE 不仅会锁定正在读取的行,而且会锁定整个行范围。但同样:仅影响 READ 操作 - 它对DELETE
或UPDATE
语句没有直接影响(除了共享锁定之外)一行可能会阻止DELETE
获取它所需的独占锁