sql-server - 带有子查询的 INSERT 的原子性

标签 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 失败了...

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

最佳答案

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

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

Adam's utility 中尝试过它正在运行。

关于sql-server - 带有子查询的 INSERT 的原子性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12397224/

相关文章:

sql - 对表进行 OUTER JOIN 时,如何将另一个表连接到外连接右侧的表?

sql-server - 基于以下示例,交叉应用和内部联接之间的区别

mysql - sql中外键表中的重复键

sql - 如何在 SQL Server 的 where 子句中使用 sum 函数?

sql-server - 当存储过程正在运行时,如何使用PRINT语句跟踪执行?

mysql - 嵌套情况下的 NULL 值问题

.net - 为什么 .NET Sql Server 访问速度比 Excel Interop 快?

c# - 我在 SQL Server 复制项目中收到 "An attempt was made to load a program with an incorrect format"错误

c# - C# 动态添加数据源到gridview

sql - 支持外键检查约束