选择SQL Server的原子更新语句

时间:2012-10-29 19:56:43

标签: sql-server-2005

INSERT stuff
SET computed = 'working'
WHERE id = (SELECT max(id) from STUFF WHERE x = y)

我想在SQL Server 2005 SP 1中将此语句设为原子。

有没有办法在不修改隔离级别的情况下执行此操作?

我需要使用Identity列作为pk来模拟插入到表中。我当前的表没有作为pk的Identity字段,但它需要像它一样。所以我需要获取伪ID字段的最大值并添加1然后插入下一行。

2 个答案:

答案 0 :(得分:2)

要锁定值,一种方法是使用SERIALIZABLE隔离级别。

DECLARE @id int;
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
BEGIN TRAN
SELECT TOP(1) @id id from STUFF WHERE x = y ORDER BY id DESC;
INSERT stuff (id, ...) VALUES (@id, ...);
COMMIT
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;

确保尽可能短。

答案 1 :(得分:1)

如果您无法添加IDENTITY列,是否可以创建另一个包含IDENTITY列的表?然后只需插入该表并使用@@ IDENTITY即可插入需要序列的表中。此技术将记住您的最后一个数字,因此您不会获得任何重用值。

类似的技术用于模拟2012版之前的SQL Server中的Oracle序列(与表无关)。

http://www.sqlmag.com/article/tsql3/simulating-oracle-sequences-in-t-sql-code

如果愿意,您始终可以将这些序列表放入单独的模式中。