我工作的一个非常大的项目,这是应该跟一个很老的指挥基地API,并进行大量的行动,他们每个人都必须执行许多命令来获得到了这一点,然后我必须保存结果的状态。如何避免的DbContext问题在多线程方案
大家会谈到我的数据库,他们添加一条记录到我的进程队列,我读它,执行一些动作,返回无论是在排队的过程本身或受人尊敬的表中的一些结果。
DB是EF DbContext,黑盒子,是在主线程中运行的动作,它运行多个动作并反复执行,直到应用程序终止。
橙盒,是子线程谁执行的操作后,他们被主线程调用。
以前我有1个问题,数据库由于事务而死亡,但是因为必须在我的队列中有1个API或者至多2个,我只觉得它在SQL管理工具下,所以我想稍后修复它。
,但新的,我觉得这个问题一段时间了,但今天我看到了,......我有一个失败的动作,然后应用程序开始重复同样的过程,一遍又一遍,而不终止它或做任何其他,但它应该返回成功或错误。所以我跟踪了一会儿,我注意到它是失败的地方(内部异常处理程序之一),它说我试图插入一个重复的密钥到数据库中,所以我去看看Db的变化,我注意到我有超过五个条目,这应该只有一个。
,所以我首先想到的每一个dB.SaveChange
之前得到改变乘坐的,所以我就在网上找到了一些代码段这使得所有的变化保持不变。 所以我开始改变我的应用程序添加这段代码:
lock(DbAction){
ClearingDbContextChanges();
AddResults() if there is any
Change() if there is any
Delete() if there is any
SetEntity as Modified if there is any
Db.SaveChanges()
}
然后之前,我跑我到达最后一个景点,在那里我发现我不能再使用此应用程序的运行,并呈现一些我的主要行动无法使用。
“如何避免多线程场景中的DbContext问题”>不要重复使用来自多个线程的相同DbContext - 每次需要时创建新的DbContext。 – Evk
当数据库对它们进行事务锁定时,访问相同数据会不会导致更多的麻烦? – deadManN
我会说它永远不会创建更多的问题,从多个线程重用相同的DbContext - 这是一个真正的禁忌。 – Evk