SpringBoot内部では、事務を呼び出しても問題の解決策が機能しません。
業務開発をする時、一つの仕事が役に立たない問題に出会いました。大体の流れはこのようにして、方法の内部のタイムミッションは事務の方法を持って呼び起こして、失敗した後に事務はロールバックしていません。資料を調べて、問題が解決されました。記録して皆さんに分かち合います。
シーン
私はここで一つのシーンをシミュレーションします。大体の呼び出し方法は下記のコードのようです。
AOPは動的エージェントの仕組みを使用しており、クラスに代理クラスを生成し、事務の関連操作はすべて代理クラスで行われる。内部方式でthisコール方式を使用する場合は、インスタンスコールを使用しており、エージェントクラスでの呼び出し方法がないため、トランザクションが無効になります。
解決策
方法は自分自身のbeanを導入すると
クラス内で
自分自身を注ぎ込む
beanは
Apple Comptextを注入します。
ガイドに
以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。
シーン
私はここで一つのシーンをシミュレーションします。大体の呼び出し方法は下記のコードのようです。
@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);
}
以上が内部メソッドの呼び出し時に、事務が機能しない原因と解決方法です。以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。