EF4 ObjectContext.SaveChanges线程安全吗?

时间:2011-12-13 14:46:14

标签: c# entity-framework thread-safety savechanges

我通过Entity Framework 4访问我的数据库。

我有一个侦听端口的服务器,等待一些消息。当消息到来时,它将被转换为表行,并且应该将其插入到数据库中。但是,可以同时发送多条消息。对于每条消息,我创建一个Task(来自TPL)并异步执行它。

这些任务中的每一个都创建一个ObjectContext实例,创建相应实体类的对象(表示DB中的表),将数据插入ObjectContext,然后调用SaveChanges方法。

因此每个线程都创建了自己的ObjectContext。 ObjectContext的实例是否可以影响ObjectContext的任何其他实例? 这种情况会有副作用吗?

(请注意,插入的数据不会产生任何参照完整性错误。)

2 个答案:

答案 0 :(得分:5)

在您的情况下,事务完整性由数据库(SQL Server)而非实体框架保证。由于每个线程都有自己的上下文,因此您不必担心每个上下文SaveChanges()干扰另一个上下文。

ObjectContext的一个实例不能影响另一个实例。您可能遇到一个SaveChanges()修改数据库的情况,导致不同上下文的后续SaveChanges()失败。但这是设计原因,也是SQL Server强制执行约束的结果。

答案 1 :(得分:1)

数据上下文通常不是线程安全的;但因为它们都是独立的(按要求),这不是问题。

过于简单化的答案是“不”,因为上下文是无关的。但是,与数据库通信的任何内容都可能具有边缘条件,具体取决于您在SaveChanges之前运行的查询,以及是否有任何结果是幻像或不可重复的读取,或者是否有任何内容正在更新具有 已被另一个请求更新,或者对单独可能正常的不同请求进行2次插入,但组合违反了唯一约束等。