我需要在其处理的每个Web请求中成为我的整个应用程序事务处理。
我需要启动事务,如果控制器中没有异常,则提交它。否则,回滚。
到目前为止,我有以下实现:
OnActionExecuted
方法,我提交或不提交。以下是我使用的技术列表:
现在,我想知道的是死锁怎么办?当两个Web请求将同时处理时会发生什么,此外他们将获得使用两个存储库(与他们的DataContext
个实例相关联)的权利,这意味着,数据库中的两个表?
例如:一个请求首先要读取表Table1
然后Table2
,同时另一个请求想要使用Table2
然后使用Table1
。
我该怎么办?
答案 0 :(得分:2)
您可以处理调用DB的事务的开始和停止,请检查此
How to prevent EntityFramework deadlock when concurrently running these two statements
希望这个帮助
答案 1 :(得分:0)
好的,我已经意识到这个问题的一些解决方案:
第一个是拥有所有表的列表并按该列表访问它们。因此,如果上下文要求两者都不会在Table2
之前访问示例Table1
,并且不会发生死锁。
第二个是创建一个懒惰的IO系统,它跟踪所有必要的更改(比如添加项目,重新获取其ID并在其他地方使用它)。但似乎很难建立起来。
另一种方法是在每个数据库请求开始时创建应用程序级锁,并在最后释放它。该解决方案完全无死锁,但只能在低负载系统上使用。