这是一个典型的“丢失更新”问题。通常的解决方式是提高隔离级别,或者为select加排他锁。但我推荐下面这种方式,可以在sql server默认的隔离级别和锁机制下解决问题。
begin tran
--注意:事务中的第一句必须是update
update 表名 set id=id+1 where ...
--获取原来的id值
declare @id int;
select @id=id-1 from 表名 where ...
利用@id,进行相应操作
视情况commit tran或rollback tran
核心思路是调整语句顺序,将update放到事务最开始,利用其排他锁,阻塞其他并发事务,保证同一时间只有一个事务执行
。