【问题标题】:Multiple isolation levels needed for a TransactionScope?TransactionScope 需要多个隔离级别?
【发布时间】:2011-04-04 08:10:34
【问题描述】:

我在我的应用程序中遇到了需要使用表锁定提示或将事务隔离级别设置为默认读取已提交以外的其他情况,以解决死锁问题。我使用的是面向服务的架构,每个服务调用都作为原子操作运行,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 隔离级别的解决方案。这很好,但在我的情况下,每个事务都是为了原子服务调用,我看不出这会在哪里起作用。例如,如果我需要在没有锁定的情况下读取一个表,并且脏读可能是可以的,然后转身进行另一次读取以进行更新,然后进行更新。我不想为整个事务设置未提交的读取,只设置一个特定的读取,那我该怎么办?

没有我可以实现的扩展,允许我添加表锁定提示,而不使用视图或存储过程,或使用 datacontext.ExecuteQuery("my raw sql string here")

【问题讨论】:

    标签: c# locking deadlock transactionscope isolation-level


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-08
      • 2011-04-24
      • 2015-08-02
      • 1970-01-01
      • 1970-01-01
      • 2013-01-25
      • 2010-12-04
      相关资源
      最近更新 更多