如何在SQL Server中锁定竞争条件?

时间:2014-06-15 09:52:07

标签: sql sql-server stored-procedures race-condition

我在SQL Server中有一个存储过程,具有以下场景:

在我的存储过程中,我有一个获取max序列的函数。我得到max serial并将其插入表中:

Set @Serial = GetMaxSerial(...)
Insert Into MyTable (Serial,...) Values (@Serial,...)

有时我的存储过程会以两种方式同时执行2次,获得相同的max serial(例如100)并尝试将其插入MyTable中。第一个插入成功完成但最后一个插入失败,我得到关于密钥的错误。

如何锁定这两行代码并强制我的sp一起运行这些代码行?

或者有更好的解决方案吗?

1 个答案:

答案 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