Mysql

關於交易知識

  • August 9, 2022

我正在自學 SQL。而且我從未在任何企業公司工作過,但我觀看並學習了一些有關 Web 開發的教程,並且我看到了用於使用數據操作語言 (DML) 將數據注入數據庫的 crud 應用程序,例如插入、更新、刪除。我問他們是否應該使用 TCL。我的意思是,如果您與企業客戶合作,我應該將此查詢作為事務執行嗎?或者我應該直接使用 DML 命令執行該操作,如果發生錯誤怎麼辦?ACID 屬性如何獲得不使用 TCL 命令的任何優勢?請幫助我理解這一點或向我指出任何方向,以便我學習。免責聲明:我為我的英語道歉

我的意思是,如果您與企業客戶合作,我應該將此查詢作為事務執行嗎?

如果案例要求數據在被操作後在事務上是一致的,那麼您應該使用事務,但這是您的選擇。換句話說,如果您要對數據庫的數據 (DML) 或結構 (DDL) 進行多項更改,並希望確保它們全部成功發生或沒有一個發生(如果失敗),那麼您將選擇使用一筆交易(TCL)。

事務也是確保對像被鎖定以防止在您進行預期更改時發生意外更改的好方法。

或者我應該使用 DML 執行該操作嗎?

如果您需要使用事務,那麼您將編寫 TCL 命令。這些 TCL 命令將圍繞您編寫的用於修改數據的 DML 命令。TCL 和 DML 命令不是相互排斥的,它們通常相互結合使用。

一個範例(使用 SQL Server 的 T-SQL 語法)如下所示:

BEGIN TRANSACTION; -- TCL command to start a transaction 
   UPDATE dbo.Movies -- DML command to update the Movies table
   SET IsOldMovie = 1 -- Part of the DML query
   WHERE ReleaseYear < 2000; -- Part of the DML query
COMMIT; -- Closing TCL command to commit the change of the DML query above and end the transaction successfully 

不同類型的命令:DQL - 數據查詢語言,DDL - 數據定義語言,DML - 數據操作語言,DCL - 數據控制語言和 TCL - 事務控制語言,都只是同一關係程式語言的不同命令的類別,SQL。請參閱SQL | DDL、DQL、DML、DCL 和 TCL 命令以獲取有關差異的更多資訊。


如果在插入數據和部分插入的數據期間發生錯誤怎麼辦,那麼 ACID 屬性如何從不使用 TCL 命令中獲得任何好處?

每個查詢都在隱式事務中執行,使其在自身內部保持一致(A C ID 原則中的C這意味著對於任何單個DML 查詢,例如INSERT,不可能只更改(插入)部分數據。要麼插入所有數據,要麼不插入。

不在 TCL 命令中包裝 DML 命令的好處是提高了並發性和性能,因為包裝在同一個顯式事務中的每個數據庫對像都在整個事務中被鎖定。因此,如果您有十個UPDATE語句,每個語句針對不同的表,那麼這十個表將在顯式 TCL 事務命令的整個持續時間內與其他查詢鎖定。權衡是,如果您沒有將所有十個查詢包裝在同一個顯式事務(TCL 命令)中,那麼如果只有一些UPDATEs 成功執行,那麼您將面臨狀態不一致的風險。在顯式事務中,如果十個中UPDATE的一個失敗,則所有十個都將被撤消(回滾)。

能否請您舉例說明直接使用 DML 命令插入數據所需的情況,是否有風險?

在多個 DML 命令不相互依賴的情況下,這不是風險。如果您有三個UPDATE彼此不相關的查詢,並且無論一個是否失敗都無關緊要,那麼您就不需要使用 TCL 命令將所有三個查詢包裝在一起。

引用自:https://dba.stackexchange.com/questions/315338