微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

sql-server – 锁定CREATE TABLE

在另一个应用程序中,我被糟糕的设计所震撼:多个线程同时执行Ensure DatabaseSchemaExists()方法,看起来基本上是这样的:
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'MyTable') AND type = N'U') BEGIN

    CREATE TABLE MyTable ( ... );

END

但是,即使在SERIALIZABLE事务中执行,此代码似乎也不是线程安全的(即并行代码尝试多次创建表).有没有机会强制SELECT语句获取一个锁,以防止另一个线程执行相同的SELECT语句?

多线程 – EnsureSchemaExists()方法有更好的模式吗?

解决方法

您最好的选择是使用显式包含事务并获取自定义独占锁以保护整个操作(SELECT和CREATE TABLE) using sp_getapplock.系统对象不遵循隔离级别请求并以与用户表相同的方式使用锁定,通过设计.

原始代码中的竞争条件是,在任何线程获得CREATE TABLE语句之前,多个线程可以断定该表不存在.

原文地址:https://www.jb51.cc/mssql/79751.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐