對於開發工程師來說,資料庫知識是必備的基礎知識,因此對資料庫的深入學習是必須的。無論是在工作中還是在面試中,資料庫知識走佔據了很重要的地位。而事務在資料庫中,是一個極其重要的概念,因此搞清楚事務的相關的知識很有必要。

1、事物

事務(transaction) 是指一組資料庫操作,要麼全部成功,要麼全部失敗。

以「A賬戶向B賬戶轉賬100元」這個轉賬操作為例說明。A賬戶要給B賬戶轉賬,需要經歷以下步驟:

  • 1.讀取A賬戶餘額;
  • 2.將A賬戶餘額減去100元;
  • 3.更新A賬戶餘額;
  • 4.讀取B賬戶餘額;
  • 5.將B賬戶餘額加100元;
  • 6.更新B賬戶餘額。

為了保證數據的一致性,這一組操作(以上的6個操作)要麼全部完成,要麼全部失敗。這就是事務。

本文將探討MySQL資料庫的事務特性。MySQL資料庫主要包括Server層和引擎層,MySQL的事務支持是在引擎層實現的。MySQL是一個支持多引擎的系統,但是並不是說所有的引擎都支持事務。例如,MySQL原生的MyISAM引擎就不支持事務,而InnoDB則支持事務,因此在MySQL資料庫中,InnoDB取代了MyISAM,成為默認的存儲引擎。

2、事務的四個特性

資料庫管理系統(DBMS)在寫入或者更新資料的過程中,為了保證事務是正確可靠的,必須具備四個特性(ACID):原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、持久性(Durability)。

2.1 原子性

原子性:一個事務中的所有操作,要麼全部完成,要麼全部不完成,不會結束在中間某個環節。事務在執行過程中,若發生錯誤,則會回滾(Rollback)到事務開始前的狀態,就像這個事務從來沒有執行過一樣。即事務不可分割、不可約簡。

例如,「A賬戶向B賬戶轉賬100元」這個事務的6個操作必須要麼全部執行要麼全部不執行,才滿足原子性。

2.2一致性

一致性:在事務開始之前和事務執行結束以後,資料庫的完整性沒有被破壞。

例如,以轉賬為例,假如A賬戶和B賬戶的餘額總共為1000,那麼不論A和B之間轉賬多少次,最終所有轉賬事務結束之後,二者餘額相加仍然應該是1000。這就是事務的一致性。

2.3 隔離性

隔離性:資料庫允許多個並發事務同時對資料庫進行讀寫和修改,多個並發事務之間相互隔離,互不干擾。

例如,給定任意2個並發事務T1和T2,在事務T1看來,T2要麼在T1開始之前已經結束,要麼在T1結束之後才才能開始,事務之間感覺不到其它的事務在並發地執行,但是事實上確實是在並發執行。

2.4 持久性

持久性:事務一旦提交,對資料庫中的數據的修改就是永久性的,即使系統故障,此修改也不會消失。

多版本並發控制(MVCC,Multi-Versioning Concurrency Control):同一條記錄在系統中可以存在多個版本。上述的對於同一個數據,不同視圖中不同值的現象就是MVCC。

那麼回滾日誌什麼時候刪除呢?在不需要的時候刪除。當系統判斷系統中沒有事務會再用這些回滾日誌的時候,就會被刪除。那麼什麼時候才不需要呢? 當系統里沒有比這個回滾日誌更早的read-view的時候。

以下討論一下,為什麼盡量不要使用長事務?

長事務表明系統中存在很老的事務視圖。由於這些事務隨時可能訪問資料庫的任何數據,因此這些事務提交之前,資料庫中涉及到它可能訪問的回滾記錄都需要保留,這就會佔用大量的存儲空間。

除了對回滾段的影響,長事務還佔用鎖資源,也可能拖垮整個庫。

因此,長事務存在潛在的風險,應該盡量避免使用。


推薦閱讀:
相关文章