一般java層面资柔,簡(jiǎn)單基礎(chǔ)理論的問答焙贷。從多個(gè)博客自己理解整理一下,加深印象贿堰。
為什么會(huì)有傳播機(jī)制辙芍?
spring 對(duì)事務(wù)的控制,是使用 aop 切面實(shí)現(xiàn)的羹与,我們不用關(guān)心事務(wù)的開始故硅,提交 ,回滾纵搁,只需要在方法上加@Transactional注解吃衅,這時(shí)候就有問題了。
場(chǎng)景一: serviceA 方法調(diào)用了 serviceB 方法腾誉,但兩個(gè)方法都有事務(wù)徘层,這個(gè)時(shí)候如果 serviceB 方法異常,是讓 serviceB 方法提交利职,還是兩個(gè)一起回滾趣效。
場(chǎng)景二:serviceA 方法調(diào)用了 serviceB 方法,但是只有 serviceA 方法加了事務(wù)猪贪,是否把 serviceB 也加入 serviceA 的事務(wù)跷敬,如果 serviceB 異常,是否回滾 serviceA 热押。
場(chǎng)景三:serviceA 方法調(diào)用了 serviceB 方法西傀,兩者都有事務(wù)斤寇,serviceB 已經(jīng)正常執(zhí)行完,但 serviceA 異常池凄,是否需要回滾 serviceB 的數(shù)據(jù)抡驼。
spring定義了7中事務(wù)傳播機(jī)制
REQUIRED(TransactionDefinition.PROPAGATION_REQUIRED)
支持當(dāng)前事務(wù)鬼廓,如果沒有事務(wù)會(huì)創(chuàng)建一個(gè)新的事務(wù)
默認(rèn)級(jí)別?
記憶點(diǎn):有 ---》???? 無---》創(chuàng)建
SUPPORTS(TransactionDefinition.PROPAGATION_SUPPORTS)
支持當(dāng)前事務(wù)肿仑,如果沒有事務(wù)的話以非事務(wù)方式執(zhí)行
記憶點(diǎn):有 ---》???? 無---》
MANDATORY(TransactionDefinition.PROPAGATION_MANDATORY)
支持當(dāng)前事務(wù),如果沒有事務(wù)拋出異常
記憶點(diǎn):有 ---》???? 無---》error
REQUIRES_NEW(TransactionDefinition.PROPAGATION_REQUIRES_NEW)
創(chuàng)建一個(gè)新的事務(wù)并掛起當(dāng)前事務(wù)
記憶點(diǎn):有 ---》創(chuàng)建???? 無---》創(chuàng)建
NOT_SUPPORTED(TransactionDefinition.PROPAGATION_NOT_SUPPORTED)
以非事務(wù)方式執(zhí)行碎税,如果當(dāng)前存在事務(wù)則將當(dāng)前事務(wù)掛起
記憶點(diǎn):有 ---》無 ??? 無---》
NEVER(TransactionDefinition.PROPAGATION_NEVER)
以非事務(wù)方式進(jìn)行尤慰,如果存在事務(wù)則拋出異常
記憶點(diǎn):有 ---》error ??? 無---》
NESTED(TransactionDefinition.PROPAGATION_NESTED)
如果當(dāng)前存在事務(wù),則在嵌套事務(wù)內(nèi)執(zhí)行雷蹂。如果當(dāng)前沒有事務(wù)伟端,則進(jìn)行與PROPAGATION_REQUIRED類似的操作。
記憶點(diǎn):有 ---> ??? 無---》創(chuàng)建??? 有嵌套
springboot設(shè)置事務(wù)傳播的地方