四種隔離模式主要是用來解決不同線程的事務造成的幾種問題:
1.修改丟失:兩個事務A,B對同一數據同時進行讀取與修改,出現事務B 覆蓋事務A的提交結果
2.臟讀:事務A讀到事務B修改卻未提交的數據,事務B回滾數據修改操作,導致了事務A獲得數據是臟數據(也可以理解為事務A獲取的數據與數據庫中存儲的數據是不一致的)
3.(不可重復讀)虛讀:事務A先讀取某一行數據,事務B對改行數據進行修改,事務B再一次讀取該行數據時就會造成前后兩次讀取結果不一致。
4.幻讀:事務A讀取某段數據,事務B對其進行插入或者刪除操作時,當事務A重新讀取該段數據時會造成前后兩次查詢的數據不一致,出現第一次比第二次多或者少的現象。
為了解決上面的問題,出現了四種事務隔離模式
1.Read uncommitted(未授權讀取、讀未提交):(排他寫鎖)同一時間只允許一個事務進行寫操作的存在,可以允許多個事務進行讀取。可以解決(修改丟失)的問題,但是會出現臟讀,虛讀,幻讀這些問題
2.Read committed(授權讀取、讀提交):(排他寫鎖、瞬間共享讀鎖)同一時間只允許一個事務進行寫操作禁止其他事務進行讀與寫,可以解決(修改丟失,臟讀)不能解決虛讀,幻讀
3.Repeatable read(可重復讀取):(排他寫鎖、共享讀鎖)同一時間只允許一個事務進行寫操作禁止其他事務進行讀與寫,同一時間一個事務讀取的時不允許其他事務進行寫(可以讀取)。可以解決(修改丟失,臟讀,虛讀),但不能解決幻讀。
4.序列化:事務只能一個一個按照序列來進行讀寫,這樣並發性性能不高,可以解決上面4個問題。
大多數數據庫的默認級別就是Read committed,比如Sql Server , Oracle。
Mysql的默認隔離級別就是Repeatable read。
Oracle支持2種事務隔離級別:READ COMMITED,SERIALIZABLE.
Mysql支持4種事務隔離級別。