1.什么是臟讀,臟寫,不可重復(fù)讀,幻讀
1.1.臟讀和臟寫實際上都是操作到了未提交的數(shù)據(jù)上導(dǎo)致的問題
臟讀:A事務(wù)在讀取數(shù)據(jù)的同時,B事務(wù)在修改數(shù)據(jù).而A事務(wù)讀取到了B事務(wù)未提交的值,如果B事務(wù)回滾了,再次讀取時就發(fā)現(xiàn)值被回滾了.
臟寫:A事務(wù)在寫數(shù)據(jù)時,B事務(wù)也在寫數(shù)據(jù).A事務(wù)寫在B事務(wù)的未提交版本上.B事務(wù)要反悔,所以回滾了.導(dǎo)致A事務(wù)也不明不白的回滾了.
1.2.不可重復(fù)讀
在不會發(fā)生臟讀的前提下,即讀到的數(shù)據(jù)都是已提交的情況
有一個事務(wù)A是連續(xù)不斷的對一條數(shù)據(jù)進行查詢,
突然中間有事務(wù)B進來修改了事務(wù)并且已提交,那么事務(wù)A第二次讀到的就是B事務(wù)提交之后的值,
事務(wù)C也進來修改了事務(wù)并且已提交,那么事務(wù)A第三次就會讀到的是事務(wù)C提交之后的值.
從而導(dǎo)致每一次讀取的數(shù)據(jù)都不一致,就是造成了不可重復(fù)讀的現(xiàn)象,
但此現(xiàn)象可以視作問題,也可以不視作問題.要根據(jù)具體的業(yè)務(wù)而定的



1.3.幻讀
事務(wù)A在查一批數(shù)據(jù)出來時,事務(wù)B在這個范圍中插入了一批數(shù)據(jù)且提交了,導(dǎo)致了第一次查詢和第二次查詢出來的條數(shù)發(fā)生了變化,就是幻讀


2.sql標準中的四個事務(wù)隔離級別
因為有這四大問題,所以才會有sql的四個事務(wù)隔離級別來選擇
讀未提交(read uncommitted):只是不會發(fā)生臟寫
可能會引發(fā)臟讀,不可重復(fù)讀,幻讀,極容易導(dǎo)致數(shù)據(jù)混亂 一般也不使用這個級別
讀已提交(read committed) RC:不會發(fā)生臟讀和臟寫
可能會引發(fā)可重復(fù)讀,幻讀
可重復(fù)度(repeatable read) innodb默認是這個級別 RR:不會發(fā)生臟讀臟寫不可重復(fù)讀
innodb引擎中使用mvcc解決了快照讀的幻讀,使用了行鎖加間隙鎖.鎖住一部分解決了當前讀的幻讀
串行化(serializable):因為性能極差 一般不用這個級別
串行化不允許有多個事務(wù)并發(fā),所以性能極差
3,spring中特殊處理某些類的事務(wù)級別
在注解中@Transactional(isolation=Isolation.DEFAULT)
DEFAULT值為mysql默認隔離級別
分別對應(yīng)四個事務(wù)隔離級別的值為
READ_COMMITTED
READ_UNCOMMITTED
REPEATABLE_READ
SERIALIZABLE