一.?什么是事務(wù)?
????????我們?cè)陂_發(fā)企業(yè)應(yīng)用時(shí),對(duì)于業(yè)務(wù)人員的一個(gè)操作實(shí)際是對(duì)數(shù)據(jù)讀寫的多步操作的結(jié)合。由于數(shù)據(jù)操作在順序執(zhí)行的過程中,任何一步操作都有可能發(fā)生異常,異常會(huì)導(dǎo)致后續(xù)操作無(wú)法完成,此時(shí)由于業(yè)務(wù)邏輯并未正確的完成,之前成功操作數(shù)據(jù)的并不可靠,需要在這種情況下進(jìn)行回退。
????????事務(wù)的作用就是為了保證用戶的每一個(gè)操作都是可靠的,事務(wù)中的每一步操作都必須成功執(zhí)行,只要有發(fā)生異常就回退到事務(wù)開始未進(jìn)行操作的狀態(tài)。
????????事務(wù)管理是Spring框架中最為常用的功能之一,我們?cè)谑褂肧pring Boot開發(fā)應(yīng)用時(shí),大部分情況下也都需要使用事務(wù)。
二.?快速入門?
????????在Spring Boot中,當(dāng)我們使用了spring-boot-starter-jdbc或spring-boot-starter-data-jpa依賴的時(shí)候,框 架會(huì)自動(dòng)默認(rèn)分別注入DataSourceTransactionManager或JpaTransactionManager。所以我們不需要任何額外 配置就可以用@Transactional注解進(jìn)行事務(wù)的使用。
三.? 傳播行為
????????事務(wù)的第一個(gè)方面是傳播行為(propagation behavior)。當(dāng)事務(wù)方法被另一個(gè)事務(wù)方法調(diào)用時(shí),必須指定事務(wù)應(yīng)該如何傳播。例如:方法可能繼續(xù)在現(xiàn)有事務(wù)中運(yùn)行,也可能開啟一個(gè)新事務(wù),并在自己的事務(wù)中運(yùn)行。Spring定義了七種傳播行為:
3.1? PROPAGATION_REQUIRED?(required ,?必須? ?默認(rèn)值)
? ? ? ? A如果有事務(wù),B將使用該事務(wù);
????????如果A沒有事務(wù),B將創(chuàng)建一個(gè)新的事務(wù)。
3.2? PROPAGATION_SUPPORTS(supports?,支持)
????????A如果有事務(wù),B將使用該事務(wù);
????????如果A沒有事務(wù),B將以非事務(wù)執(zhí)行。
3.3? PROPAGATION_MANDATORY(mandatory?,強(qiáng)制)
????????A如果有事務(wù),B將使用該事務(wù);
????????如果A沒有事務(wù),B將拋異常。
3.4??PROPAGATION_REQUIRES_NEW (requires_new,必須新的)
????????如果A有事務(wù),將A的事務(wù)掛起,B創(chuàng)建一個(gè)新的事務(wù);????
????????如果A沒有事務(wù),B創(chuàng)建一個(gè)新的事務(wù)。
3.5? PROPAGATION_NOT_SUPPORTED (not_supported?,不支持)
????????如果A有事務(wù),將A的事務(wù)掛起,B將以非事務(wù)執(zhí)行;
????????如果A沒有事務(wù),B將以非事務(wù)執(zhí)行。
3.6? PROPAGATION_NEVER (never,從不)
????????如果A有事務(wù),B將拋異常;
????????如果A沒有事務(wù),B將以非事務(wù)執(zhí)行。
3.7??PROPAGATION_NESTED?(nested?,嵌套)
????????A和B底層采用保存點(diǎn)機(jī)制,形成嵌套事務(wù)。
? ? ? ?外層事務(wù)的回滾可以引起內(nèi)層事務(wù)的回滾。而內(nèi)層事務(wù)的異常并不會(huì)導(dǎo)致外層事務(wù)的回滾,它是一個(gè)真正的嵌套事務(wù)。