name - sql transaction用法




圍繞單個陳述的交易是做什麼的? (4)

一個可能的藉口是,單個語句可能會導致一堆其他SQL通過觸發器運行,並且它們可以防止那裡出現壞事,儘管我希望任何DBMS都有使用隱式事務的常識。同樣的方式。

我能想到的另一件事是,某些API允許您禁用自動提交,並且代碼的寫入以防萬一有人這樣做。

我理解一個事務如何對協調一對更新有用。 我不明白的是在交易中包裝單個陳述,這是我所見過的90%。 實際上,在我的經驗中,在我的經驗中更常見的是找到一系列邏輯相關的事務,每個事務都包含在它們自己的事務中,但整個事務並沒有包含在事務中。

在MS-SQL中,在事務中包裝單個選擇,單個更新,單個插入或單個刪除有什麼好處嗎?

我懷疑這是迷信編程。


它什麼都不做。 所有單獨的SQL語句(除了極少數例外,如沒有日誌的批量插入或截斷表)都是自動“在事務中”,無論你是否明確說出來......(即使它們插入,更新或刪除數百萬行) 。

編輯:基於@ Phillip的評論......在當前版本的SQL Server中,Even Bulk Inserts和Truncate Table會將一些數據寫入事務日誌,儘管沒有其他操作那麼多。 與事務角度的關鍵區別在於,在這些其他類型的操作中,正在修改的數據庫表中的數據不在日誌中,允許其回滾。

所有這些意味著語句對數據庫中的數據所做的更改會記錄到事務日誌中,以便在操作失敗時撤消它們。

“Begin Transaction”,“Commit Transaction”和“RollBack Transaction”命令提供的唯一功能是允許您將兩個或多個單獨的SQL語句放入同一事務中。

編輯:(以加強標記評論......)是的,這可能歸因於“迷信”編程,或者它可能表明對數據庫事務性質的基本誤解。 一個更慈善的解釋是,它只是過度應用一致性的結果,這是不恰當的,而艾默生委婉語的另一個例子是:

愚蠢的一致性是小腦袋的大人物,
受到小政治家,哲學家和神職人員的崇拜


正如查爾斯布雷塔納所說,“它什麼都不做” - 除了已經完成的任何事情之外什麼都沒有。

曾經聽說過關係數據庫的“ACID”要求嗎? “A”代表Atomic,意味著該語句可以完整地工作,也可以不工作 - 並且在執行語句時, 不會 對受該查詢影響的數據進行其他查詢。 BEGIN TRANSACTION / COMMIT將此鎖定功能“擴展”為多個語句完成的工作,但它不會對單個語句添加任何內容。

但是,數據庫事務日誌始終寫入修改數據庫(插入,更新,刪除)時。 這不是一種選擇,這一事實往往會刺激人們。 是的,批量插入和恢復模式很奇怪,但仍然可以寫入。

我也會在這裡命名 - 降低隔離級別。 使用它會影響單個命令,但這樣做仍然不會使聲明事務包裝的查詢執行與“獨立”查詢不同的任何操作。 (請注意,對於多語句聲明的事務,它們可能非常強大且非常危險。)另請注意,“nolock”不適用於插入/更新/刪除 - 這些操作始終需要鎖定。


當您啟動顯式事務並發出DML ,語句鎖定的資源將保持鎖定狀態,並且在您手動提交或回滾之前,事務外部不會顯示語句結果。

這是您可能需要或不需要的。

例如,您可能希望向外部世界顯示初步結果,同時仍然保持對它們的鎖定。

在這種情況下,您啟動另一個事務,在第一個提交之前發出鎖定請求,從而避免競爭條件

DML語句完成或失敗後,將立即提交或回滾隱式事務。





transactions