事務的特征ACID,即原子性、一致性、隔離性、持久性。
原子性保證一個事務為一個最小的單元,內部不可分割;
一致性保證事務中的每個操作線程不可單獨提交,成功則一起提交,不成功則事務回滾;
隔離性保證不同事務間看到的數據視圖相互獨立,相互隔離(隔離級別可設置);
持久性保證事務提交後數據會持久的保存下來;
sql規范定義的事務的隔離級別:
1.READ UNCOMMITTED(讀取未提交內容)
所有事務可以看到未提交事務的執行結果,本隔離級別很少用到實際應用中,讀取未提交的數據,又稱為“髒讀”。
2.READ COMMITTED(讀取提交內容)
大多數數據庫的默認隔離級別是此級別,但不是mysql默認的。一個事務在開始的時候只能看見已提交事務所做的改變。一個事務從開始到提交前所做的任何改變都是不可見的,除非提交。這種隔離級別也稱為不可重復讀。
3.REPEATABLE READ(可重復讀)
此隔離級別是為了解決可重復讀隔離級別導致的問題即一個事務多個實例並發讀取數據時會看到不同的結果。此隔離級別不會看到其他事務提交後的結果,即事務即使提交了我也看不到。此級別也稱為“幻讀”。
4.SERIALIZABLE(可串行化)
可串行化是最高的隔離級別,它通過強制事務排序,使之不可重讀,解決了幻讀的問題。此隔離級別會在每個讀的數據行上加共享鎖,使用這種隔離級別會產生大量的超時現象,一般實際開發中不會用到。
mysql加鎖機制 :
根據類型可分為共享鎖(SHARED LOCK)和排他鎖(EXCLUSIVE LOCK)或者叫讀鎖(READ LOCK)和寫鎖(WRITE LOCK)。
根據粒度劃分又分表鎖和行鎖。表鎖由數據庫服務器實現,行鎖由存儲引擎實現。
mysql提供了3種事務型存儲引擎,InnDB、NDB Cluster和Falcon。
一個事務執行的任何過程中都可以獲得鎖,但是只有事務提交或回滾的時候才釋放這些鎖。這些都是隱式鎖定,也可以顯式鎖定,InnoDB支持顯式鎖定,例如:
SELECT .... LOCK IN SHARE MODE (加共享鎖)
SELECT .....FOR UPDATE(加排他鎖)
多版本並發控制(重要):
Mysql的事務存儲引擎不是簡單實用行加鎖機制,而是叫多版本並發控制(MVCC)技術,和行加鎖機制關聯實用。以便應對更高的並發,當然是以消耗性能作為代價。
每種存儲引擎對MVCC的實現方式不同,InnoDB引擎的簡單實現方式如下:
InnoDB通過為每個數據航增加兩個隱含值的方式來實現。這兩個隱含值記錄了行的創建時間,以及過期時間。每一行存儲事件發生時的系統版本號。每一次開始一個新事務時版本號會自動加1,每個事務都會保存開始時的版本號,每個查詢根據事務的版本號來查詢結果。
作者 lhc1986