需要關於下面的存儲過程的建議以避免併發問題。使用開始提交回退避免併發返回語句和UPDLOCK,HOLDLOCK
Create PROCEDURE [SD_SaveUpdate_DepartmentDetails]
@DeptID int,
@DepartmentName varchar(100),
@DepartmentID int out
AS
BEGIN
Begin Try
-------------------------Insert Update Department Details-----------------------
Begin
SET NOCOUNT ON
BEGIN TRAN Department
IF EXISTS(SELECT * FROM DepartmentTable WITH (UPDLOCK, HOLDLOCK) WHERE DepartmentName= @DepartmentName)
BEGIN
UPDATE DepartmentTable SET DepartmentName= @DepartmentName WHERE DeptID = @DeptID
set @[email protected]
END
ELSE
BEGIN
INSERT INTO DepartmentTable (DepartmentName) VALUES (@DepartmentName)
set @[email protected]@IDentity
END
COMMIT Transaction Department
End
-------------------------Insert Update Department Details-----------------------
End Try
Begin Catch
set @DepartmentID=0
End Catch
End
是我上面的方法使用(UPDLOCK,HOLDLOCK)正確。
我想設置@DepartmentID輸出參數=「-1」,如果部門沒有爲USER2保存,因爲它是重複的。我需要在上面的SP中添加set @ DepartmentID = -1行。
在catch塊我設置@ DepartmentID = 0,如果有一些錯誤,同時保存。但我也想設置@ DepartmentID = -1時重複occcurs。
在博客的其中一篇博文中,我看到使用HOLDLOCK以避免併發症的使用。我想知道其他用戶是否可以在SP運行時訪問(選擇)數據。
你可以請這個SP以及optimitic幫助我(成本效益),以便我可以在所有存儲過程中使用相同的邏輯。
謝謝,
Prathap。
你可以有一個唯一約束/索引重複這個問題混合多種不同的擔憂在一起:用戶界面,併發和T-SQL邏輯。一次問一件事。例如,我沒有看到用戶界面與這個問題有什麼關係。從這個問題中刪除所有UI的東西。目前的形式不值得回答。 – usr
我試圖更清楚我需要什麼..編輯我的問題 – user2859242
如果2005有'MERGE',那對你來說是更好的選擇。 –