SpringBoot内部では、事務を呼び出しても問題の解決策が機能しません。


業務開発をする時、一つの仕事が役に立たない問題に出会いました。大体の流れはこのようにして、方法の内部のタイムミッションは事務の方法を持って呼び起こして、失敗した後に事務はロールバックしていません。資料を調べて、問題が解決されました。記録して皆さんに分かち合います。
シーン
私はここで一つのシーンをシミュレーションします。大体の呼び出し方法は下記のコードのようです。

  @Override
  @Transactional(rollbackFor = RuntimeException.class)
  public void insertUser(User user) {
    userMapper.insertUser(user);
    throw new RuntimeException("");
  }
  
  /**
   *         
   *
   * @param user
   */
  @Override
  public void invokeInsertUser(User user) {
    this.insertUser(user);
  }
原因
AOPは動的エージェントの仕組みを使用しており、クラスに代理クラスを生成し、事務の関連操作はすべて代理クラスで行われる。内部方式でthisコール方式を使用する場合は、インスタンスコールを使用しており、エージェントクラスでの呼び出し方法がないため、トランザクションが無効になります。
解決策
方法は自分自身のbeanを導入すると
クラス内で@Autowiredを介してbeanを導入し、その後、beanを呼び出すことによって、AOPを使用したエージェント動作を実現する。
自分自身を注ぎ込む

  @Autowired
  @Lazy
  private UserService service;
invokeInsertUser方法を修正します。

  /**
   *        bean        
   * @param user
   */
  @Override
  public void invokeInsertUser(User user) {
    this.service.insertUser(user);
  }
方法二Application Contectを通じてbeanを導入する。
beanはApplicationContextで取得し、beanを介して内部方法を呼び出し、beanのエージェントクラスを使用した。
Apple Comptextを注入します。

  @Autowired
  ApplicationContext applicationContext;
invokeInsertUser方法を修正します。

  /**
   *         applicationContext   bean
   * @param user
   */
  @Override
  public void invokeInsertUser(User user) {
    ((UserService)applicationContext.getBean("userService")).invokeInsertUser(user);
  }
方法三、AopContectを通じて、現在のクラスのエージェントを取得するAopContextを通じて、現在のクラスのエージェントを取得し、直接にエージェントクラスを通じて方法を呼び出します。
ガイドに@EnableAspectJAutoProxy(exposeProxy=true)の注釈を追加します。invokeInsertUser方法を修正します。

  /**
   *         applicationContext   bean
   *
   * @param user
   */
  @Override
  public void invokeInsertUser(User user) {
    ((UserService) AopContext.currentProxy()).invokeInsertUser(user);
  }
以上が内部メソッドの呼び出し時に、事務が機能しない原因と解決方法です。
以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。