我有一个将数据插入数据库(SQL Server 2008)的过程,但我无法修改其模式。该表具有int PK,但没有自动递增。因此,我需要获取最大的id,递增它然后插入数据(并返回新id)。此事务还需要同时更新多个其他表格。显然,我努力避免同时插入造成的竞争条件。
Begin Transaction (Read Committed)
DECLARE @MyVar int;
--here be the race condition
SET @MyVar = (( SELECT MAX(value) FROM MyTable WITH (ROWLOCK, XLOCK, HOLDLOCK)) + 1);
INSERT INTO MyTable ....
UPDATE MyOtherTable SET Val = @MyVar WHERE WhatEver
SELECT MyRetValName = @MyVar
INSERT INTO MyThirdTable ...
Commit Transaction
事务隔离级别和表锁提示足以防止竞态条件吗?还是需要使用UPDLOCK来代替ROWLOCK?(如果插入失败,我有一个单独的“重试”过程)