我在我的应用程序中使用最新版本的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个任务)在平行下!).
到目前为止我尝试过的解决方案但没有奏效:
无论如何,这是一个简单的C#控制台应用程序,您可以下载并尝试复制该问题.这个测试应用程序将执行您输入的N个任务,并简单地创建一个数据库并在之后进行清理.