在事務發生時插入不相關的數據
我正在考慮對我的應用程序實施事務以幫助解決一致性問題。我正在使用 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 中)一個事務將等待另一個事務完成。
如何實施它以保證這種情況永遠不會發生?
它會發生——很多很多次,每一天。
數據庫是專門為應對它而建構的。