MySQL從5.5.8開始,Innodb就是默認的存儲引擎,Innodb最大的特點是:支持事務、支持行級鎖。
既然支持事務,那么就會有處理並發事務帶來的問題:更新丟失、臟讀、不可重復讀、幻讀;相應的為了解決這四個問題,
就產生了事務隔離級別:未提交讀(Read uncommitted),已提交讀(Read committed),可重復讀(Repeatable read),可序列化(Serializable)。
並發事務會帶來的問題
在平常的項目開發里數據庫操作一般都是並發執行的,即有多個事務並發執行,數據庫事務並發帶來的問題有:
1、丟失更新:最后的更新覆蓋了其他事務之前的更新,而事務之間並不知道,發生更新丟失。更新丟失,可以完全避免,應用對訪問的數據加鎖即可。
2、臟讀:一個事務看到了另一個事務未提交的更新數據;當事務讀取尚未提交的數據時,就會發生這種情況。
例如事務A正在訪問數據,並且對數據進行了修改,更改了一行數據,這種修改還沒有提交到數據庫中,而事務B在事務A提交更新之前讀取了已更新的行,然后使用了這個數據。
如果事務A回滾該更新,則事務B使用的這個數據由於還沒有提交,就會被認為是不曾存在的數據,即為臟數據,根據臟數據所做的操作可能是不正確的。
事務B讀取到事務A已經修改但尚未提交的數據。
3、 不可重復讀:在同一事務中,兩次讀取同一數據,得到內容不同,也就是有其他事務更改了這些數據;
指在一個事務內多次讀同一數據。在這個事務還沒有結束時,另一個事務也訪問該數據。那么,在第一個事務中的兩次讀數據之間,由於第二個事務的修改導致第一個事務兩次讀取的數據可能不太一樣。這就發生了在一個事務內兩次讀到的數據是不一樣的情況,因此稱為不可重復讀。
4、幻讀:一個事務在執行過程中讀取到了另一個事務已提交的插入數據;即在第一個事務開始時讀取到一批數據,但此后另一個事務又插入了新數據並提交,此時第一個事務又讀取這批數據但發現多了一條,即好像發生幻覺一樣。
臟讀:讀取到修改但未提交的數據
幻讀:讀取到新增且已提交的數據
事務隔離機制
並發處理帶來的問題中,更新丟失可以完全避免,由應用對數據加鎖即可。臟讀、不可重讀度、幻讀,其實都是數據庫的一致性問題,必須由一定的事務隔離機制來解決。