我在SQL Server中有一个存储过程,具有以下场景:
在我的存储过程中,我有一个获取max序列的函数。我得到max serial并将其插入表中:
Set @Serial = GetMaxSerial(...)
Insert Into MyTable (Serial,...) Values (@Serial,...)
有时我的存储过程会以两种方式同时执行2次,获得相同的max serial(例如100)并尝试将其插入MyTable中。第一个插入成功完成但最后一个插入失败,我得到关于密钥的错误。
如何锁定这两行代码并强制我的sp一起运行这些代码行?
或者有更好的解决方案吗?
答案 0 :(得分:1)
SERIALIZABLE事务隔离级别的一个非常好的场景。事务隔离级别决定在已经使用行/资源时,访问其他事务对行/资源的访问级别。要阅读有关事务隔离级别的更多信息,请阅读此链接SET TRANSACTION ISOLATION LEVEL
。
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
BEGIN TRANSACTION
Set @Serial = GetMaxSerial(...)
Insert Into MyTable (Serial,...) Values (@Serial,...)
COMMIT TRANSACTION