Spring事務(wù)傳播行為問題解決
這篇文章主要介紹了Spring事務(wù)傳播行為問題解決,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
一、簡介
Spring事務(wù)配置及相關(guān)說明詳見:https://www.jb51.net/article/177710.htm。這里說明spring事務(wù)的幾點(diǎn)注意:
1、默認(rèn)只會檢查回滾RuntimeException的異常。
2、@Transactional注解只能作用于public的方法上,默認(rèn)傳播行為 Propagation.REQUIRED
3、service內(nèi)部方法之間的調(diào)用,不會被spring攔截到,也即不會產(chǎn)生事務(wù)
二、坑點(diǎn)
主要的坑點(diǎn)就是在嵌套事務(wù)上,當(dāng)service內(nèi)部方法之間調(diào)用的時候,很可能會產(chǎn)生預(yù)期之外的效果。例如下例子:
saveUser保存用戶,如果過程出現(xiàn)異常,則執(zhí)行saveMsg方法。
public class UserServiceImpl implements UserService{
 
  @Autowired
  private UserDao userDao;
  @Autowired
  private MsgDao msgDao;
  @Autowired
  private MsgService msgService;
    @Autowired
    private UserService userService;
 
   
  @Transactional(propagation = Propagation.REQUIRED)
  public void saveUser(User user) throws Exception {
    System.out.println(user.toString());
    try {
      userDao.saveUser(user);
      int i = 1/0;
//     saveUser2(user);
    } catch (Exception e) {
//     msgService.saveMsg();
//           this.saveMsg();
      userService.saveMsg();
      throw new RuntimeException();
    }
  }
   
  @Transactional(propagation = Propagation.REQUIRES_NEW)
  public void saveMsg() {
    TbMsg msg = TbMsg.builder().name("xiaocao").msg("xiaoxiao").age(27).build();
    msgDao.saveMsg(msg);
  }
}
單元測試,調(diào)用saveUser方法,并沒有達(dá)到想要的效果(saveUser異常,SaveMsg隔離級別是REQUIRES_NEW,理論上應(yīng)該能入庫)。
失敗原因即是上面第一節(jié)中說的:同一個service中的方法調(diào)用,不會產(chǎn)生新事務(wù)。Spring 事務(wù)的管理控制,主要是通過AOP的動態(tài)代理增強(qiáng)來實(shí)現(xiàn)的,目標(biāo)對象本身并沒有任何的事務(wù)管理能力,都是通過代理對象動態(tài)增強(qiáng)功能去實(shí)現(xiàn)事務(wù)管理。在同一個service中的方法調(diào)用,相當(dāng)于是目標(biāo)對象本身的this調(diào)用,并沒有經(jīng)過代理對象,所以自然的事務(wù)配置的嵌套均無效。
解決策略:
1、saveMsg移動到另一個service中,在UserServiceImpl中導(dǎo)入MsgService,saveUser中通過MsgService類去調(diào)用。
2、UserServiceImpl中注入自己,通過注入的自身service進(jìn)行調(diào)用。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持我們。
欄 目:Java
下一篇:通過實(shí)例解析spring bean之間的關(guān)系
本文標(biāo)題:Spring事務(wù)傳播行為問題解決
本文地址:http://www.jygsgssxh.com/a1/Java/8743.html
您可能感興趣的文章
- 01-10Springboot中@Value的使用詳解
 - 01-10springboot實(shí)現(xiàn)文件上傳步驟解析
 - 01-10springboot jta atomikos實(shí)現(xiàn)分布式事物管理
 - 01-10SpringBoot使用RabbitMQ延時隊列(小白必備)
 - 01-10如何基于SpringBoot部署外部Tomcat過程解析
 - 01-10SPRING BOOT啟動命令參數(shù)及源碼詳析
 - 01-10springboot集成fastDfs過程代碼實(shí)例
 - 01-10springmvc級聯(lián)屬性處理無法轉(zhuǎn)換異常問題解決
 - 01-10SPRINGBOOT讀取PROPERTIES配置文件數(shù)據(jù)過程詳解
 - 01-10Spring注解和同步鎖不能同步問題解決
 


閱讀排行
本欄相關(guān)
- 01-10Java實(shí)現(xiàn)動態(tài)模擬時鐘
 - 01-10Springboot中@Value的使用詳解
 - 01-10JavaWeb實(shí)現(xiàn)郵件發(fā)送功能
 - 01-10利用Java實(shí)現(xiàn)復(fù)制Excel工作表功能
 - 01-10Java實(shí)現(xiàn)動態(tài)數(shù)字時鐘
 - 01-10java基于poi導(dǎo)出excel透視表代碼實(shí)例
 - 01-10java實(shí)現(xiàn)液晶數(shù)字字體顯示當(dāng)前時間
 - 01-10基于Java驗(yàn)證jwt token代碼實(shí)例
 - 01-10Java動態(tài)顯示當(dāng)前日期和時間
 - 01-10淺談Java中真的只有值傳遞么
 
隨機(jī)閱讀
- 01-10C#中split用法實(shí)例總結(jié)
 - 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
 - 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
 - 01-11ajax實(shí)現(xiàn)頁面的局部加載
 - 04-02jquery與jsp,用jquery
 - 01-10delphi制作wav文件的方法
 - 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
 - 01-10使用C語言求解撲克牌的順子及n個骰子
 - 08-05織夢dedecms什么時候用欄目交叉功能?
 - 08-05DEDE織夢data目錄下的sessions文件夾有什
 


