mysql學(xué)習-5.mysql中并發(fā)事務(wù)產(chǎn)生的問題

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容