1
我們需要更新一組表,這應該在1交易的範圍內完成。更新和檢查vs選擇與holdlock
我的同事提出了以下方法
Begin Tran
Declare @tmp Table (id int);
UPDATE tbl1
SET --set some fields
, [Status] = 3
Output deleted.Status
Into @tmp
WHERE ID = @Given_ID
AND [Status] = 7
If Exists(SELECT 1
FROM @tmp
WHERE id = 7)
BEGIN
-- Do some other updates and inserts
.....
Commit Tran
RETURN 1
END
rollback Tran
RETURN 0
我的建議是做如下
Begin tran
If Exists(SELECT 1
FROM tbl1 WITH (updlock, holdlock)
WHERE [status] = 7 AND [email protected]_ID)
BEGIN
UPDATE tbl1
SET ...
, [Status] = 3
WHERE ID = @Given_ID
AND [Status] = 7
-- Do some other updates and inserts
.....
Commit tran
Return 1
END
rollback Tran
RETURN 0
能否請您點哪種方法更好,並解釋爲什麼? 我們可以做得更好嗎?
在此先感謝。
只需在您的測試環境中嘗試一下並找出答案。 「不成熟的優化是萬惡之源」 - Donald Knuth。 – 2014-09-26 13:13:21
'begin tran' 'SELECT * tbl1 WITH(updlock,holdlock)WHERE TradeId = 3' 'update tbl1 SET SellerID = 12 Where TradeId = 3' 'commit tran' 工作正常! – Vahagn 2014-09-26 13:54:59
你的同事的建議完全是你做的,但將一些值插入到@tmp表中。根據數據的重要性(插入到tmp表中的值),可以判斷哪種方法更好。 – 2014-09-26 20:30:42