第一种方法:
仅用数据库事物恐怕不能解决问题,应该是数据库事务+加排它锁,可以防止,脏读、不可重复读、幻读。
SQL Server 中可以:
BEGIN TRAN
SELECT @maxid = max(id)+1 FROM test(XLOCK,PAGLOCK)
COMMIT TRAN
XLOCK 使用排它锁并一直保持到由语句处理的所有数据上的事务结束时。使用PAGLOCK或TABLOCK指定该锁,保证其它查询被堵塞。
第二种方法:用数据库中用存储过程解决,借助数据库本身的并发控制机制
@newID int out
update sequence_table
set @newID = nowid + 1,
nowid = nowid + 1
where key = 'orderPrimarykey'
return @newID