1. 程式人生 > >MySQL事務隔離級別與鎖

MySQL事務隔離級別與鎖

髒讀:資料1;A事務修改2未提交,B事務檢視2,A事務ROLLBACK,B事務看到不正確資料。
不可重複讀:A事務檢視,B事務修改提交,A事務再次檢視,資料不一樣。
reaptable red可重讀:A事務檢視,B事務不能提交修改。
幻讀:A事務修改全部行,B事務插入新行,A事務檢視新行沒被修改
serializable:事務B只能等到A提交才能插入新資料。


四種隔離級別:
1、read uncommited讀未提交資料:所有的事務都可以“看到”未提交事務的執行結果;會導致髒讀、不可重複讀和幻讀的問題的出現
2、read commited讀已提交資料:一個事務在開始時,只能"看見"已提交事務所做的改變;Oracle和sql server預設的級別,可以避免髒讀,但不可重複讀和幻讀問題仍然會出現。
3、Repeatable red可重讀:確保同一事務的多個例項在併發讀取資料時,會看到同樣的行。
事務在讀取某資料的瞬間(就是開始讀取的瞬間),必須先對其加 行級共享鎖,直到事務結束才釋放;
事務在更新某資料的瞬間(就是發生更新的瞬間),必須先對其加 行級排他鎖,直到事務結束才釋放。
4、Serializable可序列化:最高的事務隔離級別,每個讀的資料上加上共享鎖
事務在讀取資料時,必須先對其加 表級共享鎖 ,直到事務結束才釋放;
事務在更新資料時,必須先對其加 表級排他鎖 ,直到事務結束才釋放。


隔離級 髒讀可能性 不可重複讀可能性 幻讀可能性 加鎖讀
READ UNCOMMITED是是是 否
READ COMMITED否是是 否
REAPTABLE READ否否是 否
SERILIZABLE否 否否是


事務的隔離級別通過鎖機制實現


共享鎖(S鎖,讀鎖):若事務T對資料物件A新增S鎖,則事務T允許讀取A但不允許修改A,其他事務只能對A加X鎖
由讀表操作加上的鎖,加鎖之後其他使用者只能獲取該表和行的共享鎖,不能獲取排它鎖,也就是隻能讀不能寫。


排它鎖(X鎖,寫鎖):若事務T對資料物件A新增X鎖,則只允許T讀取和修改A,其他事務不能再對A新增任何型別的鎖,直到T釋放此鎖。
由寫表操作加上的鎖,加鎖之後其他使用者只能對錶進行讀操作,而不能進行寫操作,直到事務結束才釋放。


四種隔離級別,開啟事務,預設對錶資料加上共享鎖,其他事務只能對錶進行讀操作,而不能進行寫操作,直到事務結束才會被釋放。