具有子查询的INSERT的原子性

时间:2012-09-12 22:59:53

标签: sql-server tsql sql-server-2012

假设

CREATE TABLE TableA
(
    IntColumn INT NOT NULL PRIMARY KEY
)
INSERT INTO TableA VALUES (0)

是以下原子?即如果多个应用程序线程执行以下操作,我是否有最终PK违规的风险?

INSERT INTO TableA
VALUES ((SELECT MAX(IntColumn) FROM TableA) + 1)

你能指点我这方面的任何文件吗?我的google-fu失败了......

[我知道自动递增列,但这对我实际做的事情来说还不够。]

2 个答案:

答案 0 :(得分:2)

This answer显示了所需的锁定提示:

INSERT INTO TableA
WITH (TABLOCKX,HOLDLOCK) -- added
VALUES ((SELECT MAX(IntColumn) FROM TableA) + 1)

Adam's utility中尝试了它并且它正在发挥作用。

答案 1 :(得分:1)

您使用SQL 2012标记了此问题。如果这是您的环境,则可以使用新的序列功能:http://msdn.microsoft.com/en-us/library/ff878091.aspxhttp://msdn.microsoft.com/en-us/library/ff878370.aspx