我目前正在嘗試將規范模式寫入 SQL DB 中的多個相關表,但在評估記錄是否在更新/插入之前存在時,我遇到了 DUPLICATE KEY ID 沖突。
BizTalk 每 5 分鐘從學生管理系統接收更改記錄,將它們映射到存盤程序,然后呼叫該程序將更改寫入我們主資料庫中的 5 個表。
我相信這是因為我在存盤程序中使用了不正確的設計模式。
當前設計:
IF EXISTS (Select student_id FROM student_modules WHERE student_id @student_id and module_id = @module_id)
-- THEN UPDATE THE RECORD
ELSE
-- INSERT THE RECORD
從邏輯上講,這是有道理的,但是 BizTalk 同時收到 2 個具有完全相同的學生和模塊 ID 的更改記錄,然后嘗試為每個記錄呼叫存盤程序。SQL 然后恐慌,因為當它評估第一條訊息中的邏輯時,它嘗試執行 INSERT 同時評估第二條訊息中的相同邏輯 - 并告訴我我正在嘗試插入一個 DUPLICATE KEY。我嘗試使用在以下鏈接中找到的 UPSERT 模式(設計如下),但這似乎完全鎖定了 student_modules 表。
BEGIN TRANSACTION;
UPDATE dbo.t WITH (UPDLOCK, SERIALIZABLE) SET val = @val WHERE [key] = @key;
IF @@ROWCOUNT = 0
BEGIN
INSERT dbo.t([key], val) VALUES(@key, @val);
END
COMMIT TRANSACTION;
https://sqlperformance.com/2020/09/locking/upsert-anti-pattern
有沒有我想念的更清潔的方法?
uj5u.com熱心網友回復:
您可以使用MERGE Transact-SQL 命令
INSERT tbl_A (col, col2)
SELECT col, col2
FROM tbl_B
WHERE NOT EXISTS (SELECT col FROM tbl_A A2 WHERE A2.col = tbl_B.col);
您還需要考慮更改您的 Orchestration 以便它訂閱相同學生 ID 的進一步更新(單例型別模式)或將您的發送埠設定為有序交付,以防止嘗試同時更新相同的記錄.
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/435011.html
標籤:sql tsql 商谈 上插 biztalk-2013
