更新時間:2019-08-06 11:28:06 來源:動力節點 瀏覽2210次
一、事務引發的問題
1、dirty reads 臟讀
一個事務正在對數據進行更新操作,但是更新還未提交,另一個事務這時也來操作這組數據,并且讀取了前一個事務還未提交的數據,而前一個事務如果操作失敗進行了回滾,后一個事務讀取的就是錯誤的數據,這樣就造成了臟讀
2、不可重復讀
一個事務多次讀取同一個數據,在該事務還未結束時,另一個事務也對該數據進行了操作,而且在第一個事務兩次讀取之間,第二個事務對數據進行了更新,那么第一個事務前后兩個讀取到的數據是不同的,這樣就造成了不可重復讀
3、幻讀
第一個數據正在查詢某一條數據,這時,另一個事務又插入了一條符合條件的數據,第一個事務在第二次查詢符合同一條件的數據時,發現多了一條前一次查詢時沒有的數據,仿佛幻覺一樣,這就是幻讀
4、**不可重復讀和幻讀的區別
不可重復讀是指在同一查詢事務中多次進行,由于其他提交事務所做的修改和刪除,每次返回不同的結果集,此時發生不可重復讀
幻讀是指在同一查詢事務中多次進行,由于其他提交的事務所做的插入操作,每次返回不同的結果集,此時發生幻讀
表面上看,區別就在于不可重復讀能看見其他事務提交的修改和刪除,而幻讀能看見其他事務提交的插入
二、spring 事務隔離級別
1、default:(默認)
默認隔離級別,使用數據庫默認的事務隔離級別
2、read_uncommitted:(讀未提交)
這是事務最低的隔離級別,他允許另外一個事務可以看到這個事務未提交的數據,這種隔離級別會產生臟讀,不可重復讀和幻讀
3、read_committed(讀已提交)
保證一個事務修改的數據提交后才能被另外一個事務讀取,另外一個事務不能讀取該事務未提交的數據.這種事務隔離級別可以避免臟讀,但是可能會出現不可重復讀和幻讀
4、repeatable_read(可重復讀)
這種事務級別可以防止臟讀,不可重復讀.但是可能出現幻讀.他除了保證一個事務不能讀取另一個事務未提交的數據外,還保證了不可重復讀
5、Serializable 串行化
這是花費最高代價但是最可靠的事務隔離級別。事務被處理為順序執行。防止了臟讀、不可重復讀、幻讀
三、事務的傳播行為
1、requierd
如果有事務那么加入事務,沒有的話新建一個
2、not_supported
不開啟事務
3、requires_new
不管是否存在事務,都創建一個新的事務,原來的掛起,新的執行完,繼續執行老事務
4、mandatory
必須在一個已有的事務中執行,否則拋出異常
5、never
必須在一個沒有的事務中執行,否則拋出異常
6、supports
如果其他bean調用這個方法,在其他bean中聲明事務,那就用事務.如果其他bean沒有聲明事務那就不用事務
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習