TransactionScope需要多个隔离级别?

时间:2010-08-26 15:12:27

标签: c# locking deadlock transactionscope isolation-level

我遇到了我的应用程序中需要使用表锁提示或将事务隔离级别设置为默认Read Committed以外的其他情况的情况,以解决死锁问题。我使用的是面向服务的体系结构,每个服务调用都作为原子操作运行,而Linq To Sql则用作轻量级DAL。每个服务调用都会调用我的业务层并声明一个新的事务,如下所示:

using (var scope = new TransactionScope())
{
   // Get datacontext

   // do Business Logic stuff, including database operations via Linq To Sql

   // Save transaction
   scope.Complete();
}

问题是有时我的业务逻辑复杂,需要许多数据库操作。一些读取,一些写入,一些读取更新等等,都在同一个服务调用中,因此是相同的事务。

我已经读过Linq To Sql无法为你的linq查询添加表锁定提示,而是建议使用TransactionScope隔离级别的解决方案。这很好,但在我的情况下,每个Transaction都是为了原子服务调用的目的,我不知道这会起作用。例如,如果我需要在没有锁定的情况下读取一个表,并且脏读取可能没问题,并且为了更新而转向并执行另一次读取,并进行更新。我不想为整个事务设置Read Uncommitted,只有一个特定的读取,所以我该怎么办?

是否没有我可以实现的扩展,允许我添加表锁提示,不使用视图或存储过程,或使用datacontext.ExecuteQuery(“我的原始sql字符串在这里”)

1 个答案:

答案 0 :(得分:0)

我认为这里最好的答案是使用多个事务,并批量只在一个批次中读取“脏”的事务,以及需要在另一个批次中提交读取的更新。如果任何信息需要跨批处理,请为该数据设置临时内存缓存。