- Spring事務(wù)的特性及隔離級(jí)別同事務(wù),詳情請(qǐng)見事務(wù)——什么是事務(wù),事務(wù)的特性,事務(wù)的隔離級(jí)別_醉酒的戈多的博客-CSDN博客
一、Spring事務(wù)的實(shí)現(xiàn)方式及原理
1.實(shí)現(xiàn)方式
在使用Spring框架的時(shí)候,有以下兩種事務(wù)的實(shí)現(xiàn)方式:
- 編程式事務(wù):用戶自己通過(guò)代碼來(lái)控制事務(wù)的處理邏輯
- 聲明式事務(wù):通過(guò)@Transactional注解來(lái)實(shí)現(xiàn)
?????????事務(wù)的操作本來(lái)應(yīng)該是由數(shù)據(jù)庫(kù)來(lái)進(jìn)行控制,但是為了方便用戶進(jìn)行業(yè)務(wù)邏輯的操作,spring對(duì)事務(wù)功能進(jìn)行了擴(kuò)展實(shí)現(xiàn),一般很少會(huì)用編程式事務(wù),更多的是通過(guò)添加@Transactional注解來(lái)進(jìn)行實(shí)現(xiàn),當(dāng)添加此注解之后事務(wù)的自動(dòng)功能就會(huì)關(guān)閉,有spring框架來(lái)幫助進(jìn)行控制。
2.實(shí)現(xiàn)原理
????????Spring的事務(wù)操作是AOP的一個(gè)核心體現(xiàn),當(dāng)一個(gè)方法添加@Transactional注解之后,spring會(huì)基于這個(gè)類生成一個(gè)代理對(duì)象,會(huì)將這個(gè)代理對(duì)象作為bean,當(dāng)使用這個(gè)代理對(duì)象的方法的時(shí)候,如果有事務(wù)處理,那么會(huì)先把事務(wù)的自動(dòng)提交給關(guān)系,然后去執(zhí)行具體的業(yè)務(wù)邏輯,如果執(zhí)行邏輯沒(méi)有出現(xiàn)異常,那么代理邏輯就會(huì)直接提交,如果出現(xiàn)任何異常情況,那么直接進(jìn)行回滾操作,當(dāng)然用戶可以控制對(duì)哪些異常進(jìn)行回滾操作。
二、Spring事務(wù)的傳播特性
????????當(dāng)使用@Transactional注解實(shí)現(xiàn)事務(wù)時(shí),且多個(gè)事務(wù)方法相互調(diào)用時(shí),事務(wù)如何在這些方法之間進(jìn)行傳播。spring中提供了7中不同的傳播特性,來(lái)保證事務(wù)的正常執(zhí)行。具體使用方式如下:
@Transactional(propagation = Propagation.REQUIRED)
public int saveUser(User user){
scoreDao.save(**);
return userDao.save(user);
}
Spring事務(wù)的7中傳播特性:?
- ? REQUIRED:默認(rèn)的傳播特性,如果當(dāng)前沒(méi)有事務(wù),則新建一個(gè)事務(wù),如果當(dāng)前存在事務(wù),則加入這個(gè)事務(wù)
方法A中調(diào)用方法B,B方法的事務(wù)傳播設(shè)置為PROPAGATION_REQUIRED,則如果A方法上有事務(wù),B就用A的事務(wù),沒(méi)有的話,B就自己新建一個(gè)事務(wù)。
- ? SUPPORTS:當(dāng)前存在事務(wù),則加入當(dāng)前事務(wù),如果當(dāng)前沒(méi)有事務(wù),則以非事務(wù)的方式執(zhí)行
方法A中調(diào)用方法B,B方法的事務(wù)傳播設(shè)置為PROPAGATION_SUPPORTS,則如果A方法上有事務(wù),B就用A的事務(wù),沒(méi)有的話,B就以非事務(wù)方式執(zhí)行。
- ? MANDATORY:當(dāng)前存在事務(wù),則加入當(dāng)前事務(wù),如果當(dāng)前事務(wù)不存在,則拋出異常
方法A中調(diào)用方法B,B方法的事務(wù)傳播設(shè)置為PROPAGATION_MANDATORY,則要求A方法上有事務(wù),有的話,B用A的事務(wù)。A沒(méi)有的話,就報(bào)錯(cuò)。
- ? REQUIRED_NEW:創(chuàng)建一個(gè)新事務(wù),如果存在當(dāng)前事務(wù),則掛起該事務(wù)
方法A中調(diào)用方法B,B方法的事務(wù)傳播設(shè)置為PROPAGATION_REQUIRES_NEW,則如果A方法上有事務(wù),則將A方法的事務(wù)掛起,B用自己的事務(wù)。A方法沒(méi)有事務(wù)的話,B自己就新建一個(gè)事務(wù)。
- ? NOT_SUPPORTED:以非事務(wù)方式執(zhí)行,如果存在當(dāng)前事務(wù),則掛起當(dāng)前事務(wù)
方法A中調(diào)用方法B,B方法的事務(wù)傳播設(shè)置為PROPAGATION_NOT_SUPPORTED,則如果A方法上有事務(wù),則將A方法的事務(wù)掛起(因?yàn)锳、B方法是在同一個(gè)線程中執(zhí)行的)以非事務(wù)方式執(zhí)行,以非事務(wù)方式執(zhí)行。A沒(méi)有事務(wù),就以非事務(wù)方式執(zhí)行。
- ? NEVER:不使用事務(wù),如果當(dāng)前事務(wù)存在,則拋出異常
方法A中調(diào)用方法B,B方法的事務(wù)傳播設(shè)置為PROPAGATION_NEVER,則要求A方法上不能有事務(wù),有的話,就報(bào)錯(cuò)。A沒(méi)有事務(wù),就以非事務(wù)方式執(zhí)行,B始終是以非事務(wù)方式執(zhí)行。
- ? NESTED:如果當(dāng)前事務(wù)存在,則在嵌套事務(wù)中執(zhí)行,否則REQUIRED的操作一樣
方法A中調(diào)用方法B,B方法的事務(wù)傳播設(shè)置為PROPAGATION_NESTED,則如果A方法上有事務(wù),則B方法的事務(wù)嵌套在A方法事務(wù)中。A方法沒(méi)有事務(wù)的話,B自己就新建一個(gè)事務(wù)。
?NESTED與REQUIRED和REQUIRED_NEW的區(qū)別如下:
? NESTED和REQUIRED_NEW的區(qū)別:
? REQUIRED_NEW是新建一個(gè)事務(wù)并且新開始的這個(gè)事務(wù)與原有事務(wù)無(wú)關(guān),而NESTED則是當(dāng)前存在事務(wù)時(shí)會(huì)開啟一個(gè)嵌套事務(wù),在NESTED情況下,父事務(wù)回滾時(shí),子事務(wù)也會(huì)回滾,而REQUIRED_NEW情況下,原有事務(wù)回滾,不會(huì)影響新開啟的事務(wù)
? NESTED和REQUIRED的區(qū)別:文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-649372.html
? REQUIRED情況下,調(diào)用方存在事務(wù)時(shí),則被調(diào)用方和調(diào)用方使用同一個(gè)事務(wù),那么被調(diào)用方出現(xiàn)異常時(shí),由于共用一個(gè)事務(wù),所以無(wú)論是否catch異常,事務(wù)都會(huì)回滾,而在NESTED情況下,被調(diào)用方發(fā)生異常時(shí),調(diào)用方可以catch其異常,這樣只有子事務(wù)回滾,父事務(wù)不會(huì)回滾。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-649372.html
到了這里,關(guān)于Spring——Spring事務(wù)的實(shí)現(xiàn)方式及傳播特性的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!