亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

SpringBoot內(nèi)部調(diào)用事務(wù)不起作用問題的解決方案

 更新時間:2019年10月10日 11:01:23   作者:平頭哥的技術(shù)博文  
這篇文章主要介紹了SpringBoot事務(wù)不起作用問題的解決方案,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下

在做業(yè)務(wù)開發(fā)時,遇到了一個事務(wù)不起作用的問題。大概流程是這樣的,方法內(nèi)部的定時任務(wù)調(diào)用了一個帶事務(wù)的方法,失敗后事務(wù)沒有回滾。查閱資料后,問題得到解決,記錄下來分享給大家。

場景

我在這里模擬一個場景,大概的調(diào)用方式就如下面的代碼這樣。

  @Override
  @Transactional(rollbackFor = RuntimeException.class)
  public void insertUser(User user) {
    userMapper.insertUser(user);
    throw new RuntimeException("");
  }
  
  /**
   * 內(nèi)部調(diào)用新增方法
   *
   * @param user
   */
  @Override
  public void invokeInsertUser(User user) {
    this.insertUser(user);
  }

原因

AOP使用的是動態(tài)代理的機制,它會給類生成一個代理類,事務(wù)的相關(guān)操作都在代理類上完成。內(nèi)部方式使用this調(diào)用方式時,使用的是實例調(diào)用,并沒有通過代理類調(diào)用方法,所以會導(dǎo)致事務(wù)失效。

解決辦法

方法一 引入自身bean

在類內(nèi)部通過@Autowired將本身bean引入,然后通過調(diào)用自身bean,從而實現(xiàn)使用AOP代理操作。

注入自身bean

  @Autowired
  @Lazy
  private UserService service;

修改invokeInsertUser方法

  /**
   * 解決方法一 在bean中將自己注入進來
   * @param user
   */
  @Override
  public void invokeInsertUser(User user) {
    this.service.insertUser(user);
  }

方法二 通過ApplicationContext引入bean

通過ApplicationContext獲取bean,通過bean調(diào)用內(nèi)部方法,就使用了bean的代理類。

注入ApplicationContext

  @Autowired
  ApplicationContext applicationContext;

修改invokeInsertUser方法

  /**
   * 解決方法二 通過applicationContext獲取到bean
   * @param user
   */
  @Override
  public void invokeInsertUser(User user) {
    ((UserService)applicationContext.getBean("userService")).invokeInsertUser(user);
  }

方法三 通過AopContext獲取當(dāng)前類的代理類

通過AopContext獲取當(dāng)前類的代理類,直接通過代理類調(diào)用方法

在引導(dǎo)類上添加@EnableAspectJAutoProxy(exposeProxy=true)注解

修改invokeInsertUser方法

  /**
   * 解決方法三 通過applicationContext獲取到bean
   *
   * @param user
   */
  @Override
  public void invokeInsertUser(User user) {
    ((UserService) AopContext.currentProxy()).invokeInsertUser(user);
  }

以上就是內(nèi)部方法調(diào)用時,事務(wù)不起作用的原因及解決辦法。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

最新評論