2012-09-11 90 views
6

我配音的工作,一些SP,我已經發現,不管是誰寫的代碼使用的交易上一個更新語句像這樣上一個更新語句

begin transaction 
*single update statment:* update table whatever with whatever 
commit transaction 

我明白,這是錯誤的,因爲使用事務當您想要更新多個更新時使用事務。 我想從理論上理解,使用上面的代碼有什麼含義? 更新無論有沒有交易的表有什麼區別?有沒有額外的鎖或什麼東西?

+1

這是一個單一陳述的交易。也許最初的開發者認爲未來可能需要額外的陳述/行動。 –

回答

5

也許交易被列入由於現有或未來可能代碼這可能涉及的其他數據。也許開發者只是習慣於在交易中包裝代碼,以保證'安全'?

但是,如果聲明字面上只涉及單個行的單個更新,那麼在這種情況下確實沒有任何好處。交易並不一定會「鎖定」任何東西,當然,它內部執行的動作也可能會「鎖定」。它只是確保其中包含的所有操作都是全部或全無。

請注意,交易不是關於多個表格 - 這是關於多個更新。確保多次更新全部或全部發生。

因此,如果您要更新同一個表兩次,那麼在有或沒有事務的情況下會有差異。但是你的例子只顯示了一條更新語句,據推測只更新了一條記錄。

實際上,事務可能很常見的是事務將多個更新封裝到同一個表中。想象一下以下內容:

INSERT INTO Transactions (AccountNum, Amount) VALUES (1, 200) 
INSERT INTO Transactions (AccountNum, Amount) values (2, -200) 

這應該被包裹成一個事務,以確保錢被正確傳送。如果一個失敗了,那麼另一個失敗。

+0

現在的問題是:有沒有交易的單個更新陳述之間是否有區別? – user1662812

+0

@ user1662812它完全沒有。所有單個語句已經在事務中有效地進行了包裝。不過,我不相信這會創建一個外部的包裝交易。 –

4

我知道這是錯誤的,因爲當您想要更新多個表時使用了事務。

不一定。這僅涉及一個表 - 和僅2行:

--- transaction begin 

BEGIN TRANSACTION ; 

UPDATE tableX 
SET Balance = Balance + 100 
WHERE id = 42 ; 

UPDATE tableX 
SET Balance = Balance - 100 
WHERE id = 73 ; 

COMMIT TRANSACTION ; 

--- transaction end 
3

希望你的同事的代碼看起來更像這樣,否則SQL將發出語法錯誤。 根據Ypercube的評論,在事務中放置一個語句沒有真正的目的,但可能這是一個編碼標準或類似的。

begin transaction -- Increases @@TRANCOUNT to 1 
update table whatever with whatever 
commit transaction -- DECREMENTS @@TRANCOUNT to 0 

通常情況下,發出即席發言時,直接對SQL,它是包裝你的語句在一個事務是一個好主意,以防萬一不順心的事,你需要回滾,即

begin transaction -- Just in case my query goofs up 
update table whatever with whatever 
select ... from table ... -- check that the correct updates/deletes/inserts happened 
-- commit transaction -- Only commit if the above check succeeds.