プロジェクトでGoogle Guice とjOOQを使用しています。現在、Spring JDBC を使用したトランザクション処理を導入することにしました。
だから私は次のことをしました。
Guice モジュールにデータ ソースとトランザクション マネージャーを設定します。
@Provides
@Singleton
DataSource provideDataSource(IExternalSettings settings) {
Jdbc3PoolingDataSource dataSource = new Jdbc3PoolingDataSource();
// configuring DataSource
return dataSource;
}
@Provides
@Singleton
DataSourceTransactionManager provideDataSourceTransactionManager(DataSource dataSource) {
return new DataSourceTransactionManager(new TransactionAwareDataSourceProxy(dataSource));
}
次に、永続化ファサードにトランザクション マネージャーを挿入します。
@Inject
public PersistenceFacade(final DataSourceTransactionManager transactionManager) {
this.dataSource = transactionManager.getDataSource();
this.transactionManager = transactionManager;
}
後で、このデータ ソースを使用して jOOQ factory: を作成しますnew Factory(dataSource, ...)
。
最後に、データベース アクセス コードを実行します。
DefaultTransactionDefinition transactionDefinition = new DefaultTransactionDefinition();
TransactionStatus transaction = transactionManager.getTransaction(transactionDefinition);
try {
// db code in transaction
transactionManager.commit(transaction);
return result;
} catch (Exception e) {
transactionManager.rollback(transaction);
throw e;
}
ここまでは順調ですね。期待どおりに動作します。
そこで、私の次のステップは、@Transactional
Guice AOP を使用したアノテーションを導入することです。インターセプターを作成しました
class TransactionalMethodInterceptor implements MethodInterceptor {
@Inject
private DataSourceTransactionManager transactionManager;
@Override
public Object invoke(final MethodInvocation invocation) throws Throwable {
DefaultTransactionDefinition transactionDefinition = new DefaultTransactionDefinition();
TransactionStatus transaction = transactionManager.getTransaction(transactionDefinition);
try {
Object result = invocation.proceed();
transactionManager.commit(transaction);
return result;
} catch (Exception e) {
transactionManager.rollback(transaction);
throw e;
}
}
}
configure()
Guiceモジュールのメソッドで構成しました:
TransactionalMethodInterceptor transactionalMethodInterceptor = new TransactionalMethodInterceptor();
requestInjection(transactionalMethodInterceptor);
bindInterceptor(Matchers.any(), Matchers.annotatedWith(Transactional.class), transactionalMethodInterceptor);
そして今、問題が始まります。デバッガーを使用して、制御フローがインターセプターに到達することを確認できます。transactionManager.rollback(...)
特に、それは呼び出しに達します。しかし、トランザクションは実際にはロールバックされません。
何が原因かわかりません。何か案は?感謝します。ありがとう!