javascript
spring中怎么让事物提交_Spring怎么在一个事务中开启另一个事务
點(diǎn)擊上方“Java知音”,選擇“置頂公眾號(hào)”
技術(shù)文章第一時(shí)間送達(dá)!
作者:Mazin
my.oschina.net/u/3441184/blog/893628
Spring項(xiàng)目,需要在一個(gè)事務(wù)中開(kāi)啟另一個(gè)事務(wù)。
上面提到的情景可能不常見(jiàn),但是還是會(huì)有的,一旦遇到,如果業(yè)務(wù)比較復(fù)雜,就會(huì)很麻煩,但是還是有解決的方案的,比如將一個(gè)service方法拆成兩個(gè)方法,也就是將兩個(gè)操作的事務(wù)分開(kāi)。
但是這只適用于業(yè)務(wù)比較簡(jiǎn)單的,如果出現(xiàn)多次數(shù)據(jù)庫(kù)的寫(xiě)操作,而我們調(diào)用的系統(tǒng)只需要其中一個(gè)寫(xiě)操作的最新數(shù)據(jù),如果我們將它分開(kāi),那么如果調(diào)用目標(biāo)系統(tǒng)出現(xiàn)異常的時(shí)候,那么之前的寫(xiě)操作就不能回滾了。
舉個(gè)簡(jiǎn)單的例子:
@Servicepublic?class?ServiceA?{
????@Transactional
????public?void?doSomething(){
????????向數(shù)據(jù)庫(kù)中添加數(shù)據(jù);
????????調(diào)用其他系統(tǒng);
????}
}
這里就用偽代碼來(lái)做示例了,當(dāng)我們執(zhí)行了“向數(shù)據(jù)庫(kù)中添加數(shù)據(jù)”,我們?nèi)?shù)據(jù)庫(kù)中查詢,發(fā)現(xiàn)并沒(méi)有我們添加的數(shù)據(jù),但是當(dāng)我們的service這個(gè)方法執(zhí)行完成之后,數(shù)據(jù)庫(kù)中就有這條數(shù)據(jù)了,這是由于數(shù)據(jù)庫(kù)的隔離性造成的。
spring中的事務(wù)注解@transactional提供了一個(gè)參數(shù):
Propagation?propagation()?default?Propagation.REQUIRED;這個(gè)參數(shù)是定義spring事務(wù)的傳遞性的,默認(rèn)值為required,也就是如果有事務(wù),就加入事務(wù),如果沒(méi)有,就創(chuàng)建事務(wù)。這個(gè)參數(shù)的值有很多,例如REQUIRES_NEW,這個(gè)值就代表創(chuàng)建一個(gè)新的事務(wù),與原來(lái)的事務(wù)分開(kāi)。這個(gè)好像能解決我們的問(wèn)題。
我們將剛剛那個(gè)方法修改一下:
@Servicepublic?class?ServiceA?{
????@Transactional
????public?void?doSomething(){
????????insert();
????????調(diào)用其他系統(tǒng);
????}
????@Transactional(propagation?=?Propagation.REQUIRES_NEW)
????public?void?insert(){
????????向數(shù)據(jù)庫(kù)中添加數(shù)據(jù);
????}
}
執(zhí)行之后,發(fā)現(xiàn)結(jié)果還是沒(méi)有改變,必須要整體執(zhí)行完成,數(shù)據(jù)庫(kù)中數(shù)據(jù)才會(huì)出現(xiàn),說(shuō)明還是在一個(gè)事務(wù)中。
我們?cè)賹⒋a修改一下:
@Servicepublic?class?ServiceA?{
????@Autowired
????private?ServiceB?serviceB;
????@Transactional
????public?void?doSomething(){
????????serviceB.insert();
????????調(diào)用其他系統(tǒng);
????}
}
@Service
public?class?ServiceB?{
????@Transactional(propagation?=?Propagation.REQUIRES_NEW)
????public?void?insert(){
????????向數(shù)據(jù)庫(kù)中添加數(shù)據(jù);
????}
}
我們將要事務(wù)分離出來(lái)的方法寫(xiě)在另一個(gè)service中,再次測(cè)試,發(fā)現(xiàn)執(zhí)行完插入語(yǔ)句之后,數(shù)據(jù)庫(kù)中就已經(jīng)能查到數(shù)據(jù)了,說(shuō)明事務(wù)分離了,完成了我們的需求。
當(dāng)然spring其實(shí)也考慮這個(gè),在spring的配置中,我們只需要添加標(biāo)簽??或者??,并且在代碼的調(diào)用中要求使用代理對(duì)象去調(diào)用即可:
((ServiceA?)?AopContext.currentProxy()).insert();END
Java面試題專欄
【30期】說(shuō)一下HashMap的實(shí)現(xiàn)原理?【29期】Java集合框架 10 連問(wèn),你有被問(wèn)過(guò)嗎?【28期】ZooKeeper面試那些事兒【27期】Dubbo面試八連問(wèn),這些你都能答上來(lái)嗎?【26期】如何判斷一個(gè)對(duì)象是否存活?(或者GC對(duì)象的判定方法)?【25期】這三道常見(jiàn)的面試題,你有被問(wèn)過(guò)嗎?【24期】請(qǐng)你談?wù)剢卫J降膬?yōu)缺點(diǎn),注意事項(xiàng),使用場(chǎng)景【23期】請(qǐng)你談?wù)勱P(guān)于IO同步、異步、阻塞、非阻塞的區(qū)別【22期】為什么需要消息隊(duì)列?使用消息隊(duì)列有什么好處?【21期】你能說(shuō)說(shuō)Java中Comparable和Comparator的區(qū)別嗎我知道你 “在看”
總結(jié)
以上是生活随笔為你收集整理的spring中怎么让事物提交_Spring怎么在一个事务中开启另一个事务的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 对外经贸大学计算机应用基础,对外经贸大学
- 下一篇: python字典popitem和pop_