Mysql

在事務發生時插入不相關的數據

  • December 21, 2021

我正在考慮對我的應用程序實施事務以幫助解決一致性問題。我正在使用 MySQL。

我想知道如果在插入多行作為事務時會發生什麼,伺服器還需要插入單行,這是完全不相關的。

為了更清楚,我將展示一個商店的場景(假設):

執行 nodejs 的應用伺服器,並連接到 MySQL 伺服器。然後它收到一個添加 50 台新電腦庫存的請求,需要將代表其 SN 的 50 行插入到一個表中stock,再加上另一個表中的一行shipments,所有 51 行必須以原子方式插入(全部或無) . 發生這種情況時,同一個 nodejs 伺服器會收到註冊新客戶的請求,並且需要在 table 中添加一行customers

在那種情況下,如果事務失敗並且必須回滾會發生什麼?中的行customers也會被省略嗎?這種情況甚至可能嗎?或者它可能取決於實現,如果是這樣,如何實現它以保證這種情況永遠不會發生?

如果您可以在單個連接中處理所有寫入,那麼計劃 A。注意:在瀏覽器中從一個“頁面”移動到另一個“頁面”必然會導致另一個連接,因此是計劃 B。

計劃 A: BEGIN; write...; COMMIT; 並檢查錯誤。 ROLLBACK錯誤並重試整個事務。如果不成功,告訴使用者他在飛機上的座位已被佔用,他必須重新開始。

計劃 B:您必須設置另一個表來跟踪“事務”並準備回滾(等)InnoDB(更不用說 MyISAM)可以為您做的事情。

注意:如果計劃 A 花費的時間超過幾秒鐘,那麼您就是在自找麻煩和失敗。如果需要更長的時間,請切換到 B 計劃。

事務將在該事務中執行的所有語句綁定在一起。

它們要麼全部“發生”,要麼都沒有發生。該原理稱為原子性。

發生這種情況時,同一個 nodejs 伺服器收到註冊新客戶的請求,並且需要向表客戶添加一行。

事務在目前連接/會話中啟動。

通常,node.js 伺服器會打開一個的數據庫連接來服務這個請求。在這種情況下,該連接可以啟動它自己的事務。

第一個事務,插入 51 行,將發生或不發生。

第二個事務,插入一個新客戶,將發生或不發生。

您真正需要擔心的唯一時間是兩個事務都在嘗試使用

$$ the same row(s) in $$相同的表。那時(無論如何在 MySQL 中)一個事務將等待另一個事務完成。

如何實施它以保證這種情況永遠不會發生?

發生——很多很多次,每一天。

數據庫是專門為應對它而建構的。

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