read uncommited? (讀未提交)
最低級別,可讀取未提交事物的數據,這會導致臟讀,比如:某時刻會話a修改了一個數據,但還未提交,此時會話b,讀取了該數據,這是,會話a回滾了事物,這就導致數據出現了不一致狀態,這就是臟讀!
read commited ? ?(提交讀)
避免了臟讀,但會導致不可重復讀,例如:某時刻會話a的一個事物里查詢一個數據,得到的數據是1,
這是會話b修改了該數據的值為2,并提交了,此時會話a的事物有要讀取該數據,這是的數據是2,就樣就出
現了同一個事務內,讀的結果不一樣,這就是不可重復讀。(oracle和ms-sql默認的等級都是這個)
repeatable read ?(可重復讀)
mysql innodb存儲引擎的默認事務隔離級別,解決了不可重復讀的問題,但可能會出現幻讀;幻讀就是當一個事務在讀取某一范圍數據行的過程中,另一個事務對數據進行了insert操作,當用戶再次讀取的時候,就會發現新的幻影行。對于幻讀,innodb 存儲引擎通過多版本并發控制(mvcc)有效解決了幻讀現象
SERIALIZABLE ? ? (可串行化)
最高隔離級別,對事務進行強制排序。使事務之間不產生沖突,從而解決幻讀現象,在這個級別下,數
據庫的并發能力大大受限,在serializable 下,每個讀的數據行都要加鎖。
總結:隔離級別越低,事務的并發能力越好,但也可能會損害數據的一致性。
隔離級別越高,事務的并發能力越差!