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然后插入下一行。
答案 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
如果愿意,您始终可以将这些序列表放入单独的模式中。