我想用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);
}
and
public static TransactionScope GetTransactionScope()
{
TransactionOptions transactionOptions = new TransactionOptions();
transactionOptions.IsolationLevel = System.Transactions.IsolationLevel.Serializable;
return new TransactionScope(TransactionScopeOption.Required, transactionOptions);
}
Is tblUser
锁定直到Complete
命令问题?
Does IsolationLevel
在显式事务中类似于隐式事务?
Thanks
It's SQL服务器如果需要的话,它会进行锁定。Any UPDATE
or DELETE
操作必须得到一个独占锁在它影响的那些行上 - 如果这些行已经被另一个事务锁定,则它不能这样做。
因此,在您的情况下,如果您从数据库中删除了多行,SQL Server 默认情况下将锁定仅那些行- 那些正在被删除的。它不会锁定整个表。这是unless您一次删除大量行 - 如果删除更多行5'000单个事务中的行,SQL Server 将尝试执行锁升级并锁定整个表(而不是保留和管理 5000 多个单独的行锁)。
隔离级别仅定义多长时间reading将锁定一行 - 默认情况下(READ COMMITTED
),该行将有一个shared仅在读取时锁定 - 通常是非常非常短的时间。具有隔离级别可重复读取,共享锁将一直保持到当前事务结束,并且可串行化不仅会锁定正在读取的行,还会锁定整个行范围。但再说一遍:那个only影响READ运营——对运营没有直接影响DELETE
or UPDATE
语句(除了在行上拥有共享锁可能会阻止DELETE
从获取它需要的独占锁)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)