2010-08-18 115 views
1

我有2個表 - 主表和詳細表。主表的ID列是主鍵和自動ID。我有一個SP將記錄插入到兩個表中。在這個SP中,當在主表中插入一個記錄ID時,current_ident被提取並存儲在一個變量中,然後該變量被傳遞到詳細表中插入詳細記錄。當交易一個接一個地完成時,這是非常正常的。但是,當多個用戶同時創建交易時,有時一個交易的詳細記錄正在插入其他交易,這是一件危險的事情。請幫我解決這個問題。併發問題在SQL Server 2008中

+0

你能顯示你的存儲過程腳本嗎? – garik 2010-08-18 12:51:05

回答

0

您是否正確地設置了交易記錄?你的SP應該是這個樣子

BEGIN TRAN 

DECLARE @id INT 

INSERT INTO Master (x, y , z) ... 
SELECT @id = @@identity 

INSERT INTO Child (id, foo, bar) VALUES (@id, ... 

COMMIT TRAN 
RETURN 0 

:Err 
ROLLBACK 
RETURN 1 

假設這是正確的,你需要檢查你的服務器的默認隔離級別,以及連接的隔離級別執行的存儲過程,但它更可能在一個錯誤)SP

+0

例如,如果表上的觸發器向另一個表插入數據,則不會返回錯誤結果的「@@ identity」。 – 2010-08-18 12:58:06

2

使用SCOPE_IDENTITY()(返回插入同一範圍內的標識列的最後一個標識值。範圍是一個模塊:存儲過程,觸發器,函數或批處理。)而不是@@ IDENTITY。

+0

伊戈爾,非常感謝這些信息。我已使用SCOPE_IDENTITY()代替Ident_Current並將其部署到實時服務器上。我將不得不等待一個星期才能知道這個問題是否已經解決。我們很少會在服務器上看到這個錯誤。 非常感謝您的意見。 – 2010-08-24 12:46:59

+0

@Geeta K. welcome! – garik 2010-08-24 19:01:07