鉴于以下内容:
if object_id('MyTable') is null create table MyTable( myColumn int )
两个单独的调用者是否都不可能将object_id('MyTable')评估为null,因此两者都尝试创建表。
显然,该场景中的两个调用者中的一个会失败,但理想情况下没有调用者会失败,而是一个应该阻塞而另一个应该创建表,然后被阻塞的调用者将看到object_id('MyTable')为非null并且继续进行。
我可以应用什么独占锁定,这样我就不会锁定超过绝对要求?
答案 0 :(得分:2)
在初始检查之后,在创建表时使用try catch,如果错误是表已经存在,那么继续,如果没有,则会出现更大的问题
答案 1 :(得分:1)
通常CREATE TABLE
从设置和安装脚本运行,并且期望安装脚本允许从单独的连接进行并发安装是不合理的。
我建议您使用在安装/升级过程开始时获得的会话scopped应用锁,请参阅sp_getapplock
。
答案 2 :(得分:0)
我不认为,你应该担心这个。
DDL语句不在事务下运行。此外,如果表已经是由来自第一个呼叫者的呼叫创建的,则第二个呼叫者将失败。
答案 3 :(得分:0)
我不允许用户创建表格。一般来说,这是一种不好的做法。如果他们需要插入数据,表格已经存在。如果你担心两个人创建同一个表,你还担心他们的数据是否正在交叉?我不知道你的proc会做什么,但是如果表格存在然后插入那么它就像删除记录那样,那么如果两个用户同时在线,那么你可能会有奇怪的结果。但一般来说,如果您需要在运行时创建ea表,通常表明您的设计需要工作。