我有每5分钟运行一次的进程A,需要在表“EventLog”中写入一些内容。这一整天都在工作,但是晚上还有另一个B进程,需要从这个表中删除大量的旧数据。该表具有数百万行(包括斑点)和许多相关表(由级联删除),因此过程B运行时间大约为45分钟。虽然进程B正在运行,但进程A出现很多死锁警告,我想摆脱这些。TransactionScope优先级(摆脱死锁情况)
简单的选项是“当进程B运行时不要运行进程A”,但必须有更好的方法。我在两个进程中都使用EntityFramework 6和TransactionScope。我没有找到如何设置优先级或类似的东西在我的进程。这可能吗?
编辑: 我忘了说,我已经在使用每一个记录删除事务,所有记录不是一个事务。在内部循环中,我创建了新的DBContext和TransactionScope,因此每个记录都有自己的事务。我的问题是删除记录仍然需要一些时间,因为相关的BLOB和其他相关表中的数据(可以说每行约5秒)。当删除过程(B)与插入过程(A)交叉时,我仍然遇到死锁情况。
如果他们都有一定的时间,你能对齐他们吗?如果A需要1分钟才能完成,并且从20:00开始,那么你可以在20:03开始B? – Kuzgun
B在一次交易中没有理由需要45分钟。删除可以在少于30秒的交易中以较小尺寸的循环完成。解决超时问题。 – TomTom