Ari*_*ian 6 sql-server entity-framework transactions transactionscope c#-4.0
我想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);
}
Run Code Online (Sandbox Code Playgroud)
和
public static TransactionScope GetTransactionScope()
{
TransactionOptions transactionOptions = new TransactionOptions();
transactionOptions.IsolationLevel = System.Transactions.IsolationLevel.Serializable;
return new TransactionScope(TransactionScopeOption.Required, transactionOptions);
}
Run Code Online (Sandbox Code Playgroud)
被tblUser锁定,直到Complete命令问题?
IsolationLevel在显式事务中是否类似于隐式事务?
谢谢
mar*_*c_s 10
它是执行锁定的SQL Server - 如果需要的话.任何 UPDATE或DELETE操作必须对它影响的那些行进行独占锁定 - 如果这些行已被另一个事务锁定,则它不能这样做.
因此,在您的情况下,如果您从数据库中删除了许多行,则默认情况下SQL Server将仅锁定那些行 - 正在删除的行.它不会锁定整个表格.这是除非您一次删除大量行 - 如果您在单个事务中删除超过5,000行,SQL Server将尝试执行锁升级并锁定整个表(而不是保留和管理5000+个别行锁).
隔离级别仅定义读取将锁定行的时间长度- 默认情况下(READ COMMITTED),该行仅在读取时具有共享锁定 - 通常是非常短的时间.与隔离级别REPEATABLE READ,共享锁将保持到当前事务的结束,和SERIALIZABLE不仅将锁定被读取的行,但行的整个范围.但是又一次:它只影响READ操作 - 它对DELETEor UPDATE语句没有直接影响(除了在一行上有共享锁可能会阻止DELETE它获取它需要的独占锁)