1. spring 的事務(wù)屬性
屬性:描述物體特征的一系列值瓜富。例如:身高芦瘾、體重、年齡滞乙。债蓝。壳鹤。
事務(wù)屬性:描述事務(wù)特征的一系列值
1.1 什么是事務(wù)屬性
(1) 隔離屬性
(2) 傳播屬性
(3) 只讀屬性
(4) 超時屬性
(5) 異常屬性
1.2 如何添加事務(wù)屬性
@Transational(isolation = ,propagation = ,readOnly =,timeout = ,rollbackFor =)
1.3 事務(wù)屬性詳解
1.3.1 isolation(隔離屬性)
概念:它描述了事務(wù)解決并發(fā)問題的特征(并發(fā):多個事務(wù)(用戶)在同一時間,訪問操作了相同的數(shù)據(jù)惦蚊。)
產(chǎn)生的問題:
(1)臟讀:一個事務(wù)讀取了另外一個事務(wù)中沒有提交的數(shù)據(jù)器虾。會在本事務(wù)中產(chǎn)生數(shù)據(jù)不一致的問題。
解決方案:@Transational(isolation =Isolation.READ_COMMITTED)讓一個事務(wù)只能讀取其他事務(wù)提交了的事務(wù)的數(shù)據(jù)蹦锋。
(2)不可重復(fù)讀:一個事務(wù)中兆沙,多次讀取相同的數(shù)據(jù),但是讀取結(jié)果不一樣莉掂,會在本事務(wù)中產(chǎn)生數(shù)據(jù)不一致的問題葛圃。(注意:1.這個不是臟讀,2. 多次查詢在一個事務(wù)中)
解決方案:@Transactional(isolation =Isolation.REPEATABLE_READ)
本質(zhì):一把行鎖憎妙,其他事務(wù)無法操作
(3)幻影讀:一個事務(wù)中库正,多次對整表進行查詢統(tǒng)計,但是結(jié)果不一樣厘唾,會在本事務(wù)中產(chǎn)生數(shù)據(jù)不一致的問題褥符。
解決方案:@Transactional(isolation =Isolation.SERIALIZABLE)
本質(zhì):表鎖
總結(jié):
安全:SERIALIZABLE > REPEATABLE_READ > READ_COMMITTED
效率:READ_COMMITTED > REPEATABLE_READ > SERIALIZABLE
spring在設(shè)置時,要是沒有指定默認的隔離屬性抚垃,底層會調(diào)用數(shù)據(jù)庫所設(shè)置的默認屬性(mysql是REPEATABLE_READ)
1.3.2 PROPAGATION(傳播屬性)
概念:它描述了事務(wù)解決嵌套問題的特征
什么叫做事務(wù)嵌套:它指一個事務(wù)中喷楣,包含了若干個小的事務(wù)(也可以理解為一個service中調(diào)用了其他若干個service趟大,而每個service中都開啟了事務(wù))。
問題:大事務(wù)中融入了很多小的事務(wù)铣焊,他們彼此影響逊朽,最終會導(dǎo)致外部大的事務(wù)喪失了事務(wù)的原子性。
傳播屬性的值 |
外部不存在事務(wù) |
外部存在事務(wù) |
用法 |
說明 |
REQUIRED |
開啟新的事務(wù) |
融合到外部事務(wù)中 |
@Transactional(propagation=Propagation.REQUIRED) |
適用于增刪改 |
SUPPORTS |
不開啟新的事務(wù) |
融合到外部事務(wù)中 |
@Transactional(propagation=Propagation.SUPPORTS) |
適用于查詢操作 |
MANDATORY |
拋出異常 |
融合到外部事務(wù)中 |
@Transactional(propagation=Propagation.MANDATORY) |
略 |
REQUIRES_NEW |
開啟新的事務(wù) |
掛起外部事務(wù)曲伊,創(chuàng)建新的事務(wù) |
@Transactional(propagation=Propagation.REQUIRES_NEW) |
日志記錄 |
NOT_SUPPORTED |
不開啟新的事務(wù) |
掛起外部事務(wù) |
@Transactional(propagation=Propagation.NOT_SUPPORTED) |
略 |
NEVER |
不開啟新的事務(wù) |
拋出異常 |
@Transactional(propagation=Propagation.NEVER) |
略 |
NESTED |
執(zhí)行與PROPAGATION_REQUIRED類似的操作 |
在嵌套事務(wù)內(nèi)執(zhí)行 |
@Transactional(propagation=Propagation.NESTED) |
略 |
默認的傳播屬性:@Transactional(propagation=Propagation.REQUIRED)
1.3.3 readOnly(只讀屬性)
針對只進行查詢操作的業(yè)務(wù)方法叽讳,可以加只讀屬性,提高運行效率坟募。默認:false
1.3.4 timeout(超時屬性)
概念:指定了事務(wù)等待的最長時間
1. 為什么事務(wù)要進行等待:當(dāng)前事務(wù)訪問數(shù)據(jù)時岛蚤,有可能訪問的數(shù)據(jù)被別的事務(wù)進行加鎖,那么此時本事務(wù)就必須進行等待婿屹。
2. 等待的時間單位:秒
3. 應(yīng)用:@Transactional(timeout = 2)
4. 超時屬性的默認值:-1(最終由對應(yīng)的數(shù)據(jù)庫來指定)
1.3.5 rollbackFor(異常屬性)
Spring事務(wù)處理過程中
默認:對于RuntimeException及其子類灭美,采用回滾的策略。
默認:對于Exception及其子類昂利,采用的是提交的策略届腐。
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者