Rza*_*sar 1 .net c# entity-framework ef-core-3.1
我知道这DbContext
不是线程安全的,加上DbContext
缓存数据,当多个事务尝试将自己的更改保存/提交到数据库时,它可能会导致数据不一致。因此,强烈建议按请求注入它(这里)。但是我有一种情况,只有读取操作存在(在独立的类库中)并且没有事务或创建/更新/删除操作。
我的问题是:DbContext
在这种情况下作为单例注入是否安全?
实体框架开发人员明确表示,对其执行的任何操作DbContext
都不是线程安全的,而不仅仅是写入(添加、保存更改等)操作,如果您不想花几天时间调试神秘的故障,您应该相信他们日。
即使在读取操作中,EF 也可以对其非线程安全的内部结构执行内存中写入操作,您无法确定它在任何给定情况下都不会这样做。例如,从关于处理查询返回的结果集的文档中:
如果查询是跟踪查询,EF 检查数据是否表示上下文实例的更改跟踪器中已有的实体
因此,如果查询正在跟踪查询 - 它会检查当前实例的更改跟踪器是否具有相同键的此类现有实体,这意味着如果此类实体不存在 - 它会将其放入更改跟踪器。这是写操作,所以不安全。
你可以说,好吧,那我就用吧AsNoTracking()
。但是这里是另外一个问题,关于conncurrentAsNoTracking
查询- EF甚至不会让你无论如何执行。图书馆维护者说:
不可能同时使用相同的 DbContext - 不仅用于跟踪查询。具体来说,一个 DbContext 有一个到数据库的底层 DbConnection,不能同时使用。引擎盖下还有其他各种不支持多线程的组件。
但是,实例化多个 DbContext 并对其执行查询并没有错 - 无论是跟踪还是非跟踪。这应该会让你得到你正在寻找的行为。如果您遇到任何其他问题,请随时回帖。
因此,存在未记录的内部组件,它们不是线程安全的,并且您无法确定在从多个线程执行任何操作DbContext
时不会遇到此类组件。
归档时间: |
|
查看次数: |
219 次 |
最近记录: |