这是一个典型的“丢失更新”问题。通常的解决方式是提高隔离级别,或者为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放到事务最开始,利用其排他锁,阻塞其他并发事务,保证同一时间只有一个事务执行 。