记一次SQL Server创建数据库失败

在执行create database test后,报错Could not obtain exclusive lock on database 'model'. Retry the operation later.
通过在查看SQL Server的官方说明,显示引起该问题的原因是:
SQL Server在创建数据库时,会使用model数据库的副本来初始化数据库和元数据,此时必须以独占方式锁定model数据库防止从model数据库复制更改的数据,否则无法保证从数据一致性。
因此可以检查下,该model是否被其他会话占用:

IF
EXISTS(SELECT request_session_id FROM
sys.dm_tran_locks
WHERE resource_database_id =
DB_ID('Model'))
PRINT
'Model Database being used by some other session'
ELSE
PRINT
'Model Database not used by other session'

执行结果是:

Model Database being used by some other session

当model被其他会话占用时,可使用下面的语句查询是哪些会话占用

SELECT request_session_id FROM
sys.dm_tran_locks WHERE resource_database_id =DB_ID('Model');
DBCC INPUTBUFFER(spid)

结果显示有51,53, 56占用,这时只需要移除掉即可创建数据库

kill 51
kill 53
kill 56
  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
使用 Entity Framework(EF)可以动态创建 SQL Server 数据库。下面是一个示例代码: ```csharp using System.Data.Entity; public class MyDbContext : DbContext { public MyDbContext() : base("name=MyConnectionString") { // 确保数据库不存在时自动创建 Database.SetInitializer(new CreateDatabaseIfNotExists<MyDbContext>()); } // 定义实体集 public DbSet<MyEntity> MyEntities { get; set; } } public class MyEntity { public int Id { get; set; } public string Name { get; set; } } class Program { static void Main(string[] args) { // 使用 DbContext 创建数据库 using (var context = new MyDbContext()) { // 执行数据库初始化操作 context.Database.Initialize(true); // 检查数据库是否已创建 if (context.Database.Exists()) { Console.WriteLine("数据库已创建"); } else { Console.WriteLine("数据库创建失败"); } } } } ``` 在上述示例中,我们定义了一个 DbContext(MyDbContext),并在构造函数中指定了连接字符串。我们使用 `Database.SetInitializer` 方法来设置数据库初始化策略,这里使用的是 `CreateDatabaseIfNotExists` 策略,它会在数据库不存在时自动创建。 然后,在程序的入口点 `Main` 方法中,我们创建了一个 MyDbContext 实例,并调用 `context.Database.Initialize` 方法来执行数据库初始化操作。如果数据库已成功创建,我们将会看到 "数据库已创建" 的输出。 请确保在连接字符串中提供正确的 SQL Server 连接信息,并确保具有足够的权限来创建数据库。此外,还需要安装 Entity Framework 相应的 NuGet 包。 注意:动态创建数据库通常在开发和测试阶段使用,生产环境中一般不会使用动态创建数据库的方式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值