我正在开发.NET Core Web api服务,并且在BL中具有以下方法:
apk
我需要使所有实体都处于“脏读”模式。
因此,我正尝试通过以下方式使用TransactionScope:
before_script:
- apk update
- apk add sshpass
...
但是:1)这已经读取了提交模式(我从this post知道我必须开始一个事务,但是这里没有会话或数据库上下文,因为我在BL中而不在DAL中)
和2)最后出现异常必须将TransactionScope置于创建它的同一线程上。
答案 0 :(得分:1)
对于一组读取查询(脏读取),您需要事务处理
我假设您具有较高的并发性来读取未提交的数据。这可能是在Select查询中使用事务的唯一用例。我认为它们仍然与少数DML操作交织在一起
在哪里开始事务BL / DAL,它需要DbContext吗?
这取决于您的用例,如果您的设计是从BL派发将作为事务一部分的多个业务查询,则这是一个有效的起点,尤其是使用环境事务(TransactionScope)。显式的Session
或Context
是发起事务的机制之一,因为所有共享查询都无缝地征募到同一事务上下文中,但是使用TransactionScope
或{ {1}},您可以利用CommittableTransaction
来确保各种查询的参与:
TransactionScopeOption
使用Requires New
在BL和DAL级别启动环境事务,以确保征募使用相同的事务上下文。数据库连接应在可用范围内自动注册。Required
,将在BL中创建的相同对象传递到DAL存储库,并在其中明确列出Connection对象CommittableTransaction
完成后才能完成。与TransactionScope相关的问题必须放在创建它的同一线程上。
解决方案是here,它是.Net4.5.1中引入的,可确保在异步调用中使用awaits
查询的Sql Server隔离级别
您所指的是大多数系统TransactionScope
的默认设置,但是您当然可以调整设置以确保降低IsolationLevel,尽管还可以准备在应用程序中读取脏数据的隐患