小编Ran*_*lph的帖子

并行执行CREATE DATABASE语句会导致错误,但不会导致单独的SQL Server实例

我在我的应用程序中使用最新版本的Entity Framework(但我不认为EF是这里的问题,只是陈述我们正在使用的ORM)并拥有这种多租户架构.我正在做一些用C#构建的压力测试,其中它创建了X个并行运行的任务来做一些事情.在整个过程开始的某个时刻,它将为每个任务(在这种情况下为每个租户)创建一个新数据库,然后继续处理大部分操作.但是在某些任务上,它会在我尝试创建新数据库的代码的确切部分抛出2个SQL异常.

例外#1:

无法获得数据库'model'的独占锁定.稍后重试该操作.CREATE DATABASE失败.无法创建列出的某些文件名.检查相关错误.

例外#2:

超时已过期.操作完成之前经过的超时时间或服务器没有响应.

它是这两个中的任何一个并抛出我的代码的同一行(当EF创建数据库时).显然在SQL Server中,在创建数据库时,它一次只执行一次并锁定"模型"数据库(请参阅此处),因此某些正在等待的任务会引发超时或锁定"模型"错误.

这些测试是在我们的开发SQL Server 2014实例(12.0.4213)上完成的,如果我执行100个并行任务,那么某些任务就会抛出错误,有时甚至会执行近一半的任务.

但是这是所有这些中最令人不安的部分,当我在我的PC上本地安装的其他SQL服务器实例(12.0.2000)上测试时,没有这样的错误抛出并完全完成我执行的所有任务(甚至1000个任务)在平行下!).

到目前为止我尝试过的解决方案但没有奏效:

  • 将EF中的Object上下文的超时更改为无限
  • 尝试在连接字符串上添加更长或无限的超时
  • 尝试在EF上添加重试策略并使其更长并且更频繁地运行
  • 目前,尝试安装具有类似环境的虚拟机到我们的Dev服务器(使用Windows Server 2014 R2)并测试特定版本的SQL Server,以尝试查看版本是否与它有任何关系(是的,我是那个绝望:))

无论如何,是一个简单的C#控制台应用程序,您可以下载并尝试复制该问题.这个测试应用程序将执行您输入的N个任务,并简单地创建一个数据库并在之后进行清理.

c# sql-server entity-framework

7
推荐指数
1
解决办法
289
查看次数

标签 统计

c# ×1

entity-framework ×1

sql-server ×1