數據庫事務與特性

寫在前面:博主是一隻經過實戰開發歷練後投身培訓事業的「小山豬」,暱稱取自動畫片《獅子王》中的「彭彭」,總是以樂觀、積極的心態對待周邊的事物。本人的技術路線從Java全棧工程師一路奔向大數據開發、數據挖掘領域,如今終有小成,願將昔日所獲與大家交流一二,希望對學習路上的你有所助益。同時,博主也想通過此次嘗試打造一個完善的技術圖書館,任何與文章技術點有關的異常、錯誤、注意事項均會在末尾列出,歡迎大家通過各種方式提供素材。

  • 對於文章中出現的任何錯誤請大家批評指出,一定及時修改。
  • 有任何想要討論和學習的問題可聯繫我:[email protected]
  • 發佈文章的風格因專欄而異,均自成體系,不足之處請大家指正。

數據庫事務與特性

本文關鍵字:事務、原子性、一致性、隔離性、持久性


事務是數據庫中的一個概念,在交易系統和複雜業務中經常被提及。對於簡單的增刪改查場景,特別是學習階段,不需要考慮諸如併發、鎖等問題,但是我們要對事務的概念及特性有所瞭解,以便日後能夠快速定位問題和給出優化方案。

一、事務的作用

1. 事務的概念

數據庫的事物可以看成一個可以訪問和操作各種數據項的操作序列,這個序列中通常包含多個操作,這些操作要麼全部執行成功,要麼全部不執行,整個序列是一個整體。事務是一個不可分割的工作邏輯單元,在數據庫系統上執行併發操作時,事務是最小的控制單元。

2. 事務經典案例

在事務概念中,我們已經可以知道,一個事務中會包含多個操作,那麼最常見最經典的案例就是轉賬操作,由於每個人各自有自己的賬戶,所以一定會被劃分成兩個階段:

  • 付款方金額減少
  • 收款方金額增加


在整個過程中,兩個環節必須同時成功,如果收款方入賬失敗,那麼款項應該被退回到付款方,否則一定無法平賬。那麼整個交易過程就可以被看做一個事務,如果成功那麼兩個環節都不能出現問題,如果任何一個環節出現問題,那麼就要將整個操作全部還原。

二、事務的特性

既然事務作爲單個邏輯工作單元來執行一系列操作,那麼每個邏輯單元都需要具備四個性質:原子性(atomicity)、一致性(consistency)、隔離性(isolation)、持久性(durability),簡稱爲ACID。

1. 原子性(A)

原子性指的是事務的各元素是不可分割的,事務中的所有元素必須作爲一個整體提交或回滾。如果事務中的任何元素失敗,則整個事務將失敗。
對於轉賬操作,在正常情況下,如果交易成功進行,兩方的銀行賬戶金額都會被修改。如果在這一過程中,由於某種原因導致其中一個操作執行失敗,那麼會撤銷對任何賬戶餘額的修改,事務不會部分提交,將整體回滾

2. 一致性(C)

一致性指的是事務完成時,數據必須處於一致狀態。在事務開始之前,數據庫中已存儲的數據出於一致狀態(符合業務邏輯)。在執行事務的過程中,相關數據會被修改,數據可以處於不一致的狀態。當事務完成時,數據必須再次回到已知的一致狀態。
對於轉賬操作,我們必須保證付款方金額減少收款方金額增加這兩個操作處在同一個事務中,這樣就能夠保證數據的一致性。

3. 隔離性(I)

隔離性指的是對數據進行修改的所有併發事務是彼此隔離的,也就是事務之間必須是相互獨立的,不應該以任何方式依賴於或影響其他事務。修改數據的事務可以在另一個使用相同數據的事務開始之前訪問這些數據,或在其之後訪問這些數據。

由於在大用戶量場景下,同時使用相同數據的概率是很高的,事務的隔離性是通過併發控制技術來保證的。由於完全保證隔離性會導致併發性能很低,通常會適當放寬隔離性與數據一致性的要求,將在後面的文章中介紹。

4. 持久性(D)

持久性指的是當一個事務成功完成後,對數據庫的改變是永久的,任何事務或系統故障都不會導致數據丟失。 其中對於持久性的保障是通過數據庫日誌機制實現的,能夠在數據庫服務崩潰時進行數據的還原或恢復。