更新時間:2019-08-06 11:28:06 來源:動力節(jié)點 瀏覽2548次
一、事務(wù)引發(fā)的問題
1、dirty reads 臟讀
一個事務(wù)正在對數(shù)據(jù)進行更新操作,但是更新還未提交,另一個事務(wù)這時也來操作這組數(shù)據(jù),并且讀取了前一個事務(wù)還未提交的數(shù)據(jù),而前一個事務(wù)如果操作失敗進行了回滾,后一個事務(wù)讀取的就是錯誤的數(shù)據(jù),這樣就造成了臟讀
2、不可重復(fù)讀
一個事務(wù)多次讀取同一個數(shù)據(jù),在該事務(wù)還未結(jié)束時,另一個事務(wù)也對該數(shù)據(jù)進行了操作,而且在第一個事務(wù)兩次讀取之間,第二個事務(wù)對數(shù)據(jù)進行了更新,那么第一個事務(wù)前后兩個讀取到的數(shù)據(jù)是不同的,這樣就造成了不可重復(fù)讀
3、幻讀
第一個數(shù)據(jù)正在查詢某一條數(shù)據(jù),這時,另一個事務(wù)又插入了一條符合條件的數(shù)據(jù),第一個事務(wù)在第二次查詢符合同一條件的數(shù)據(jù)時,發(fā)現(xiàn)多了一條前一次查詢時沒有的數(shù)據(jù),仿佛幻覺一樣,這就是幻讀
4、**不可重復(fù)讀和幻讀的區(qū)別
不可重復(fù)讀是指在同一查詢事務(wù)中多次進行,由于其他提交事務(wù)所做的修改和刪除,每次返回不同的結(jié)果集,此時發(fā)生不可重復(fù)讀
幻讀是指在同一查詢事務(wù)中多次進行,由于其他提交的事務(wù)所做的插入操作,每次返回不同的結(jié)果集,此時發(fā)生幻讀
表面上看,區(qū)別就在于不可重復(fù)讀能看見其他事務(wù)提交的修改和刪除,而幻讀能看見其他事務(wù)提交的插入
二、spring 事務(wù)隔離級別
1、default:(默認)
默認隔離級別,使用數(shù)據(jù)庫默認的事務(wù)隔離級別
2、read_uncommitted:(讀未提交)
這是事務(wù)最低的隔離級別,他允許另外一個事務(wù)可以看到這個事務(wù)未提交的數(shù)據(jù),這種隔離級別會產(chǎn)生臟讀,不可重復(fù)讀和幻讀
3、read_committed(讀已提交)
保證一個事務(wù)修改的數(shù)據(jù)提交后才能被另外一個事務(wù)讀取,另外一個事務(wù)不能讀取該事務(wù)未提交的數(shù)據(jù).這種事務(wù)隔離級別可以避免臟讀,但是可能會出現(xiàn)不可重復(fù)讀和幻讀
4、repeatable_read(可重復(fù)讀)
這種事務(wù)級別可以防止臟讀,不可重復(fù)讀.但是可能出現(xiàn)幻讀.他除了保證一個事務(wù)不能讀取另一個事務(wù)未提交的數(shù)據(jù)外,還保證了不可重復(fù)讀
5、Serializable 串行化
這是花費最高代價但是最可靠的事務(wù)隔離級別。事務(wù)被處理為順序執(zhí)行。防止了臟讀、不可重復(fù)讀、幻讀
三、事務(wù)的傳播行為
1、requierd
如果有事務(wù)那么加入事務(wù),沒有的話新建一個
2、not_supported
不開啟事務(wù)
3、requires_new
不管是否存在事務(wù),都創(chuàng)建一個新的事務(wù),原來的掛起,新的執(zhí)行完,繼續(xù)執(zhí)行老事務(wù)
4、mandatory
必須在一個已有的事務(wù)中執(zhí)行,否則拋出異常
5、never
必須在一個沒有的事務(wù)中執(zhí)行,否則拋出異常
6、supports
如果其他bean調(diào)用這個方法,在其他bean中聲明事務(wù),那就用事務(wù).如果其他bean沒有聲明事務(wù)那就不用事務(wù)
相關(guān)閱讀