MySQL數據庫中,有四個不同的事務級別:Read uncommitted, Read committed, Repeatable read, Serializable。這些級別提供了在并發訪問數據庫時控制數據一致性的不同方法。下面對這些級別進行講解。
Read uncommitted
在Read uncommitted級別下,事務之間沒有任何約束條件。即便一個事務正在對某一數據行進行修改,其他事務也可以讀取該數據行。因此,這種級別下可能導致讀到未提交的數據,而這樣產生的數據不一致性問題是無法避免的。
Read committed
在Read committed級別下,一個事務只能讀取到已經提交的數據行。這種級別下雖然降低了數據不一致的風險,但是因為沒有鎖定數據行,可能會導致讀取到不同時間點的數據行(例如,一個事務中讀取某一數據行后,另一個事務進行修改并提交,此時前一個事務再次讀取則會發現數據不同)。
Repeatable read
在Repeatable read級別下,事務可以讀取同一數據行的最新提交版本。為了解決上述數據不一致的問題,這種級別下對數據行進行了鎖定(在該事務釋放鎖定之前,其他事務無法修改該數據行)。但是,在這種級別下由于讀取其他未提交的修改,可能導致不可重復讀問題(在同一個事務中兩次讀取某一數據行得到不同的結果)。
Serializable
在Serializable級別下,事務讀取數據行時會對該數據行進行關鍵的鎖定,這個鎖定會一直保持到事務結束,防止其他事務修改該數據行。但是這種級別下可能會導致所有的事務都互相等待,降低并發性能。另外,鎖定會增加死鎖的風險。
SET TRANSACTION ISOLATION LEVEL xxx;
START TRANSACTION;
...
當我們需要在MySQL中設置事務級別時,使用上述代碼就可以了。其中xxx需要替換成具體的事務級別(例如Read uncommitted、Read committed、Repeatable read、Serializable中的一個)。