Spring 事務(wù)的傳播機(jī)制
一、事務(wù)是什么?
將一組 sql 定義為一個(gè)事務(wù),當(dāng)某一個(gè) sql 執(zhí)行異常時(shí),整組 sql 都將執(zhí)行回滾操作。
二、Spring 事務(wù)的原理
@Transactional 注解, 通過(guò)動(dòng)態(tài)代理實(shí)現(xiàn)。Spring 在容器初始化時(shí),通過(guò) BeanPostProcessor 掃描帶有事務(wù)注解的 Bean,為其生成代理對(duì)象,然后在方法前后加入事務(wù)管理代碼。
三、Spring 事務(wù)的傳播機(jī)制
解釋一下標(biāo)題,多個(gè)事務(wù)方法之間存在調(diào)用關(guān)系,事務(wù)的傳播方式是什么樣的?
注:下面例子中 A(調(diào)用)-> B(被調(diào)用)
3.1 REQUIRED 和 REQUIRES_NEW
- Propagation.REQUIRED:(required)
默認(rèn)的事務(wù)傳播級(jí)別。如果當(dāng)前存在事務(wù), 則加?該事務(wù); 如果當(dāng)前沒(méi)有事務(wù),則創(chuàng)建?個(gè)新的事務(wù)。
A 有事務(wù),B 直接加入 A 的事務(wù)。A 沒(méi)事務(wù),B 創(chuàng)建新的事務(wù)。 - Propagation.REQUIRES_NEW:(requires_new)
創(chuàng)建?個(gè)新的事務(wù)。如果當(dāng)前存在事務(wù),則把當(dāng)前事務(wù)掛起。也就是說(shuō)不管外部?法是否開(kāi)啟事務(wù),Propagation.REQUIRES_NEW 修飾的內(nèi)部?法都會(huì)新開(kāi)啟??的事務(wù),且開(kāi)啟的事務(wù)相互獨(dú)?,互不?擾。
無(wú)論 A 有無(wú)事務(wù),B 都創(chuàng)建新的事務(wù)
3.2 SUPPORTS 和 NOT_SUPPORTED
- Propagation.SUPPORTS : (supports)
如果當(dāng)前存在事務(wù),則加?該事務(wù)。如果當(dāng)前沒(méi)有事務(wù),則以?事務(wù)的?式繼續(xù)運(yùn)?。
A 有事務(wù),B 就直接使用 A 的事務(wù),如果 A 沒(méi)有事務(wù),B 以非事務(wù)的方式進(jìn)行運(yùn)行 - Propagation.NOT_SUPPORTED:(not supported)
以?事務(wù)?式運(yùn)?,如果當(dāng)前存在事務(wù),則把當(dāng)前事務(wù)掛起(不?)。
就是不管 A 有無(wú)事務(wù),B 都直接以非事務(wù)的方式進(jìn)行運(yùn)行
3.3 MANDATORY、NEVER、NESTED
- Propagation.MANDATORY:(mandatory)
強(qiáng)制性。 如果當(dāng)前存在事務(wù),則加?該事務(wù)。如果當(dāng)前沒(méi)有事務(wù),則拋出異常。
A 有事務(wù),B 就直接使用 A 的事務(wù),如果 A 沒(méi)有事務(wù),那么就直接拋出異常 - Propagation.NEVER:(never)
以?事務(wù)?式運(yùn)?,如果當(dāng)前存在事務(wù),則拋出異常
如果A事務(wù)存在,那么就直接拋出異常。 - Propagation.NESTED : (nested)
如果當(dāng)前存在事務(wù),則創(chuàng)建?個(gè)事務(wù)作為當(dāng)前事務(wù)的嵌套事務(wù)來(lái)運(yùn)?。
如果當(dāng)前沒(méi)有事務(wù), 則該取值等價(jià)于 PROPAGATION_REQUIRED
沒(méi)有事務(wù)就創(chuàng)建事務(wù),有的話就干點(diǎn)其他的事情
總結(jié)
| 類(lèi)型 | A有事務(wù) | A無(wú)事務(wù) |
|---|---|---|
| required | 使用A事務(wù) | 創(chuàng)建新事務(wù) |
| requires_new | 創(chuàng)建新事務(wù) | 創(chuàng)建新事務(wù) |
| supports | 使用A事務(wù) | 非事務(wù) |
| not supported | 非事務(wù) | 非事務(wù) |
| mandatory | 使用A事務(wù) | ? |
| never | ? | 非事務(wù) |
| nested | 創(chuàng)建嵌套事務(wù) | 創(chuàng)建新事務(wù) |
本文來(lái)自博客園,作者:帥氣的濤啊,轉(zhuǎn)載請(qǐng)注明原文鏈接:http://www.rzrgm.cn/handsometaoa/p/18787232

浙公網(wǎng)安備 33010602011771號(hào)