业务层中的TransactionScope用于脏异步读取

时间:2018-09-03 08:01:59

标签: c# transactions transactionscope nolock

我正在开发.NET Core Web api服务,并且在BL中具有以下方法:

apk

我需要使所有实体都处于“脏读”模式。

因此,我正尝试通过以下方式使用TransactionScope:

before_script:
  - apk update
  - apk add sshpass
...

但是:1)这已经读取了提交模式(我从this post知道我必须开始一个事务,但是这里没有会话或数据库上下文,因为我在BL中而不在DAL中)

和2)最后出现异常必须将TransactionScope置于创建它的同一线程上。

1 个答案:

答案 0 :(得分:1)

  

对于一组读取查询(脏读取),您需要事务处理

我假设您具有较高的并发性来读取未提交的数据。这可能是在Select查询中使用事务的唯一用例。我认为它们仍然与少数DML操作交织在一起

  

在哪里开始事务BL / DAL,它需要DbContext吗?

这取决于您的用例,如果您的设计是从BL派发将作为事务一部分的多个业务查询,则这是一个有效的起点,尤其是使用环境事务(TransactionScope)。显式的SessionContext是发起事务的机制之一,因为所有共享查询都无缝地征募到同一事务上下文中,但是使用TransactionScope或{ {1}},您可以利用CommittableTransaction来确保各种查询的参与:

  1. 使用TransactionScopeOption使用Requires New在BL和DAL级别启动环境事务,以确保征募使用相同的事务上下文。数据库连接应在可用范围内自动注册。
  2. 使用Required,将在BL中创建的相同对象传递到DAL存储库,并在其中明确列出Connection对象
  3. 如果您的要求更加具体,直到在单独线程上的所有Child操作都完成之前,No Commit才可行,然后查看DependantTransaction,它也是System.Transaction的一部分,但它做了很多工作更紧密的绑定,主要是在多线程方案中,对于Async Await调用,您可能不需要它,因为只有在所有CommittableTransaction完成后才能完成。
  

与TransactionScope相关的问题必须放在创建它的同一线程上。

解决方案是here,它是.Net4.5.1中引入的,可确保在异步调用中使用awaits

  

查询的Sql Server隔离级别

您所指的是大多数系统TransactionScope的默认设置,但是您当然可以调整设置以确保降低IsolationLevel,尽管还可以准备在应用程序中读取脏数据的隐患