我正在通过实体框架 4 访问我的数据库。
我有一个服务器在端口上侦听,等待一些消息。当消息出现时,它被转换为表行,并应将其插入到数据库中。但是,可以同时发送多条消息。对于每条消息,我创建一个任务(从 TPL(并异步执行它。
其中每个任务都创建 ObjectContext 的一个实例,创建相应实体类的对象(表示数据库中的表(,将数据插入到 ObjectContext 中,然后调用 SaveChanges 方法。
因此,每个线程都创建了自己的 ObjectContext。ObjectContext 的实例可以影响 ObjectContext 的任何其他实例吗?这种情况会有什么副作用吗?
(请注意,插入的数据不会创建任何参照完整性错误(。
在您的情况下,事务完整性由数据库 (SQL Server( 而不是实体框架保证。由于每个线程都有自己的上下文,因此您不必担心每个上下文SaveChanges()
干扰另一个上下文。
一个实例ObjectContext
不能影响另一个实例。您可能会遇到这样一种情况:一个SaveChanges()
修改数据库的方式会导致不同上下文上的后续SaveChanges()
失败。但这是设计使然,也是SQL Server强制实施其约束的结果。
数据上下文通常不是线程安全的;但是因为它们都是独立的(每个请求(,所以这不是问题。
过于简单的答案是否定的,因为上下文是不相关的。但是,任何与数据库通信的内容都可能有边缘条件,具体取决于您在SaveChanges
之前运行的查询,以及是否有任何结果是幻像或不可重复的读取,或者是否有任何东西正在更新也被另一个请求更新的数据,或者对不同的请求执行 2 次插入,单独可以, 但组合起来违反了独特的约束等。