【发布时间】:2021-02-19 17:43:11
【问题描述】:
我有非常简单的 T-SQL 查询
DELETE FROM my_table
WHERE [id] = @Id
INSERT INTO my_table
([id], [payload])
VALUES
(@Id, @Payload)
很多这样的查询在不同的线程中执行。 INSERT 和 DELETE 处于 transaction 中,类型为 Read Commited。 99.9% 的情况下一切正常,但是当它失败时会出现以下情况:
Violation of PRIMARY KEY constraint 'PK_my_table'. Cannot insert duplicate key in object 'dbo.my_table'. The duplicate key value is (9).
The statement has been terminated.
问题出现在:
- 我们有 2 笔具有相同 @Id 的交易
- 我们在 my_table 表中没有带有 @Id 的记录
所以第一个和第二个事务以 DELETE 开头。两个事务都没有删除任何内容,因为表 my_table 中没有记录。两者都开始 INSERT 和 BOOM - 违反主键。
问题是如何在Read Commited transaction type和不使用MERGE语句的情况下避免这种情况?
【问题讨论】:
标签: sql-server multithreading tsql concurrency transactions