gpt4 book ai didi

sql-server - TransactionScope 锁定表和 IsolationLevel

转载 作者:行者123 更新时间:2023-12-02 18:28:39 25 4
gpt4 key购买 nike

我想在我的项目中使用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);
}

在发出Complete命令之前,tblUser是否已锁定?

显式事务中的IsolationLevel是否与隐式事务类似?

谢谢

最佳答案

如果需要的话,由SQL Server执行锁定。 任何 UPDATEDELETE 操作都必须对其影响的行获得独占锁 - 如果这些行已被锁定另一笔交易,它不能这样做。

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

隔离级别仅定义读取将锁定行的时间 - 默认情况下(READ COMMITTED),该行将具有共享仅在读取时锁定 - 通常是非常非常短的时间。使用隔离级别REPEATABLE READ,共享锁将一直保持到当前事务结束,并且SERIALIZABLE不仅会锁定正在读取的行,还会锁定整个行范围。但再次强调:影响READ操作 - 它对DELETEUPDATE语句(其他比在行上拥有共享锁可能会阻止 DELETE 获取所需的独占锁)

关于sql-server - TransactionScope 锁定表和 IsolationLevel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33460259/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com