c# Entity Framework怎么处理并发问题? 20
我开了两个线程,一个用于满足条件则添加或者修改XXX到数据库,另一个线程用于查询,只使用一个线程无问题,当两个线程一起使用,可能就会出现问题,异常为:不允许启动新事务,因...
我开了两个线程,一个用于满足条件则添加或者修改XXX到数据库,另一个线程用于查询,只使用一个线程无问题,当两个线程一起使用,可能就会出现问题,异常为:不允许启动新事务,因为有其他线程正在该会话中运行。
网上查了下,是ef的并发问题,但是照网上的方法试了下,例如添加修改加lock,并没有用。请大神们推荐一个好的解决方案,别百度照抄,谢谢,百度的大多都看过了。 展开
网上查了下,是ef的并发问题,但是照网上的方法试了下,例如添加修改加lock,并没有用。请大神们推荐一个好的解决方案,别百度照抄,谢谢,百度的大多都看过了。 展开
3个回答
展开全部
如果异常提示如你所说,首先有一点可以肯定,你在两个线程中使用了同一个dbcontext实例。
每个dbcontext背后都是一个真实的物理连接,且该context有着自己的实体追踪状态。在多个线程中使用同一个dbcontext,即使你加lock按顺序执行savechanges提交事务,也有可能因为实体状态紊乱导致其他的问题。其次,你应该知道在同一个dbconnection上的transaction未被提交或者回滚时是不允许开启新的transaction的,反映在ef,就会出现你遇到的异常。
请在各个线程中使用单独的dbcontext避免此类问题。
此外,事务是有隔离级别(transaction isolation level)的,应按照具体需求进行配置,请自己检索相关资料。
最后,无论何时都应该尽量让事务代码尽可能少以减少潜在的脏数据,事务死锁等问题的发生几率。如无必要不应该长时间跟踪实体状态(查询过早提交过晚)。为安全考虑,需要时应新起dbcontext,ef和数据库会为你在连接池中优化分配,大多数情况下开销是能够接受的。
每个dbcontext背后都是一个真实的物理连接,且该context有着自己的实体追踪状态。在多个线程中使用同一个dbcontext,即使你加lock按顺序执行savechanges提交事务,也有可能因为实体状态紊乱导致其他的问题。其次,你应该知道在同一个dbconnection上的transaction未被提交或者回滚时是不允许开启新的transaction的,反映在ef,就会出现你遇到的异常。
请在各个线程中使用单独的dbcontext避免此类问题。
此外,事务是有隔离级别(transaction isolation level)的,应按照具体需求进行配置,请自己检索相关资料。
最后,无论何时都应该尽量让事务代码尽可能少以减少潜在的脏数据,事务死锁等问题的发生几率。如无必要不应该长时间跟踪实体状态(查询过早提交过晚)。为安全考虑,需要时应新起dbcontext,ef和数据库会为你在连接池中优化分配,大多数情况下开销是能够接受的。
追问
对对,你说的非常对。我的确是在多个线程中使用了同一个dbcontext,大神,你回答到点了。而且我也按照你的尝试过,没使用一次添加,修改,删除都要实例一次dncontext,但是这样会不会有个问题。应该我与数据库交互非常频繁,这样我多个线程操作数据库,实例化会不会对性能与开销造成很大的影响,我现在只是测试了短时间的运行。我1秒钟大约与数据库交互需要30次左右。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询