2014-06-15 27 views
0

我有一個存儲過程在SQL Server與以下情形:如何鎖定SQL Server中的競爭條件?

在我的存儲過程中,我有一個獲取最大序列的函數。我得到的最大串口和一個表中插入:在某種程度上,這兩個,獲得相同的最高串例如100,並試圖將其插入MyTable的同時

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

有時在執行我的存儲過程2次。第一次插入成功完成,但最後一次失敗,並且出現關於密鑰的錯誤。

如何鎖定這兩行代碼並強制我的sp將這些代碼行一起運行?

還是有更好的解決方案嗎?

+1

使用序列或標識列?否則,使用'UPDLOCK'表提示或在可序列化的事務隔離級別運行事務。如果失敗,請使用應用程序鎖定('sp_getapplock') –

+0

+1 ta.speot.is。 @breceivemail:首先,你可以做的最簡單的事情就是在Serial列上創建一個UNIQUE索引。 *這將防止重複值*。 –

回答

1

SERIALIZABLE事務隔離級別的一個很好的場景。當一個行/資源已經在使用行/資源時,事務隔離級別決定訪問其他事務的級別。閱讀關於事務隔離級別的更多信息閱讀此鏈接SET TRANSACTION ISOLATION LEVEL

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; 

BEGIN TRANSACTION 

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

COMMIT TRANSACTION