EF DbContext 并发执行时可能出现的问题

现在许多Web项目都使用了IOC的DI注入组件。其中对象的生命周期管理是非常重要的。

有时我们为了提高请求的响应,经常在请求线程中执行多个子线程,然而忽略了EF的DbContext的生命周期管理。

DbContext并非是线程安全的。子线程A和子线程B 可能同时的对同一个DbContext进行操作,从而导致下面的异常(可能随机抛出其中一个)。

所以建议不要共用同一个DbContext.

{"已有打开的与此 Command 相关联的 DataReader,必须首先将它关闭。"}
“System.InvalidOperationException”类型的异常在 EntityFramework.dll 中发生,但未在用户代码中进行处理

其他信息: The context cannot be used while the model is being created. This exception may be thrown if the context is used inside the OnModelCreating method or if the same context instance is accessed by multiple threads concurrently. Note that instance members of DbContext and related classes are not guaranteed to be thread safe.
“System.NullReferenceException”类型的异常在 EntityFramework.dll 中发生,但未在用户代码中进行处理

其他信息: 未将对象引用设置到对象的实例。
“System.InvalidOperationException”类型的异常在 System.Data.dll 中发生,但未在用户代码中进行处理

其他信息: 不允许更改“ConnectionString”属性。连接的当前状态为已关闭。

测试代码

 1 private async void button1_Click(object sender, EventArgs e)
 2 {
 3     try
 4     {
 5         var mydb = new MyDbContext();
 6         var arr = new MyExecuterOfEF[2];
 7         arr[1] = new MyExecuterOfEF(mydb, (db) =>
 8         {
 9             var r = db.Tests.FirstOrDefault();
10         });
11         arr[0] = new MyExecuterOfEF(mydb, (db) =>
12         {
13             var r = db.Tests.FirstOrDefault();
14         });
15
16         Parallel.ForEach(arr, (myExecute) =>
17         {
18             myExecute.Execute();
19         });
20
21         MessageBox.Show("结束");
22     }
23     catch (Exception ex)
24     {
25         //MessageBox.Show(ex.ToString());
26         this.textBox1.Text = ex.ToString();
27     }
28 }

Demo

时间: 2024-11-08 23:46:55

EF DbContext 并发执行时可能出现的问题的相关文章

试解释下列名词:程序的顺序执行,程序的并发执行。

一个计算由若干个操作组成,若这些操作必须按照某种先后次序来执行,以保证操作的结果是正确的,则这类计算过程称为程序的顺序执行过程. 所谓的程序的并发执行是指若干个程序同时在系统中运行,这些程序的执行在时间上是重叠的,一个程序的执行尚未结束,另一个程序的执行已经开始. 补充: 顺序程序的特点: 顺序性.封闭性.可再现性. 并发程序的特点: 失去程序的封闭性.程序与计算不再一一对应.程序并发执行时的相互制约关系.

进程管理顺序执行和并发执行

一.引言 在传统的操作系统中,程序并不能独立运行,作为资源分配和独立运行的基本单位都是进程.操作系统所具有的四大特征也都是基于进程而形成的,并可从进程的观点来研究操作系统.显然,在操作系统中,进程是一个极其重要的概念. 二.程序的顺序执行及其特征 顺序执行:通常可以把一个应用程序分成若干个程序段,在各程序段之间,必须按照某种先后次序顺序执行,仅当前一操作(程序段)执行完后,才能执行后继操作. 2. 1 程序顺序执行时的特征 (1) 顺序性:处理机的操作严格按照程序所规定的顺序执行,即每一操作必须

Shell脚本中的多任务并发执行

正常情况下,Shell脚本中的命令是串行执行的,当一条命令执行完才会执行接下来的命令.比如下面这段代码: #!/bin/bash for i in {1..10};do echo $i done echo "END" 执行结果: 1 2 3 4 5 6 7 8 9 10 END 可以看到,循环体中的"echo $i"命令是串行执行的.但是如果所执行的命令耗时比较长,这就会导致整个程序的执行时间非常长,甚至可能导致程序执行时卡在那里,长时间失去响应.比如我们需要完成这

Mybatis 并发执行导致cpu占满的问题

最近线上服务经常 出现cpu达到100%的问题,发现都是执行oracle操作的方法就没有返回.经过排查,最后定位到cpu消耗在以下方法 System.Collections.Generic.Dictionary`2<system.type,system.boolean>.FindEntry (...)System.Collections.Generic.Dictionary`2<system.__canon,system.boolean>.TryGetValue (...)MyBa

并发请求时,HttpApplication的事件是如何执行的?

1 疑问: 如果系统里注册了一个HttpModule,在BeginRequest里编写了代码,执行时如果卡住,会影响其他请求的执行吗? 查阅MSDN的解释: http://msdn.microsoft.com/zh-cn/library/system.web.httpapplication(VS.80).aspx HttpApplication 类的实例是在 ASP.NET 基础结构中创建的,而不是由用户直接创建的.HttpApplication 类的一个实例在其生存期内被用于处理多个请求,但它

关于有默认值的字段在用EF做插入操作时的思考(续)

原文:关于有默认值的字段在用EF做插入操作时的思考(续) 问题描述 今天下午(看现在这时间,应该是昨天下午了哈),园友 choon 写了这样一篇博文<关于有默认值的字段在用EF做插入操作时的思考>. 博文内容主要记录的是 choon 使用 EF 做数据插入与更新时,字段默认值的问题,这个问题我们平常应该都会遇到,但是,最后博文内容包括评论,并没人能给出一个准确的答案,真是很可惜(知识点的博文都是一侃一大堆,而这些实际项目遇到的问题却回答不上来,又有什么用呢,哎...).详细内容请查看上面的博文

【说解】在shell中通过mkfifo创建命名管道来控制多个进程并发执行

背景: 工作中有两个异地机房需要传数据,数据全名很规范,在某个目录下命名为统一的前缀加上编号.如/path/from/file.{1..100}.而机房间的专线对单个scp进程的传输速度是有限制的,比如最大在100Mb/s,如果直接启动100个scp,则又会遇到ssh的并发连接数限制. 所以需要控制并发数,即不超过ssh的并发限制,又要让单网卡上的带宽接近饱和,尽快完成传输(假设专线带宽远大于单机网卡带宽) 实现 之前知道通过mkfifo创建一个命名管道,可以实现对并发的控制.现在来实现一个.

获取Executor提交的并发执行的任务返回结果的两种方式/ExecutorCompletionService使用

当我们通过Executor提交一组并发执行的任务,并且希望在每一个任务完成后能立即得到结果,有两种方式可以采取: 方式一: 通过一个list来保存一组future,然后在循环中轮训这组future,直到每个future都已完成.如果我们不希望出现因为排在前面的任务阻塞导致后面先完成的任务的结果没有及时获取的情况,那么在调用get方式时,需要将超时时间设置为0 Java代码 public class CompletionServiceTest { static class Task impleme

CUDA编程接口:异步并发执行的概念和API

1.主机和设备间异步执行 为了易于使用主机和设备间的异步执行,一些函数是异步的:在设备完全完成任务前,控制已经返回给主机线程了.它们是: 内核发射; 设备间数据拷贝函数; 主机和设备内拷贝小于64KB的存储器块时; 存储器拷贝函数中带有Async后缀的; 设置设备存储器的函数调用. 程序员可通过将CUDA_LAUNCH_BLOCKING环境变量设置为1来全局禁用所有运行在系统上的应用的异步内核发射.提供这个特性只是为了调试,永远不能作为使软件产品运行得可靠的方式. 当应用通过CUDA调试器或CU