私のアプリケーションでは、次のように作成された 2 つの transactionManager があります。
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<qualifier value="exec"/>
<property name="dataSource" ref="execDataSource"/>
</bean>
<bean id="txManagerAdmin" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<qualifier value="admin"/>
<property name="dataSource" ref="adminDataSource"/>
</bean>
同じファイルに、注釈駆動型の宣言があります。
<tx:annotation-driven transaction-manager="admin"/>
管理トランザクション マネージャーの使いやすさを簡単にするために、簡単な注釈を作成しました。
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Transactional(value="admin", rollbackFor=NullPointerException.class, propagation = Propagation.REQUIRES_NEW, isolation = Isolation.DEFAULT)
public @interface AdminTx {
}
そして、ここでトランザクション注釈を使用した私のメソッド:
@AdminTx
@Override
public UaCatalogDTO addUa(UaDTO uaDTO) throws TechnicalException {
MapSqlParameterSource namedParameterSource = new MapSqlParameterSource();
mapAllUaFields(uaDTO, namedParameterSource);
try {
jdbcTemplate.update(SqlQueries.ADD_UA, namedParameterSource);
} catch (DuplicateKeyException e) {
throw new TechnicalException(e, "ADM001");
}
if (1==1) //due to compiler
throw new NullPointerException(); //to test the transaction is working
}
このメソッドは、インターフェイスのおかげで別のクラスから呼び出されます。Bean は Spring @Autowired アノテーションによって注入されました。オブジェクトは次のjdbcTemplate
コードで作成されました。
@Autowired
@Qualifier("adminDataSource")
public void setDataSource(DataSource dataSource) {
this.jdbcTemplate = new NamedParameterJdbcTemplate(dataSource);
}
私の問題は、jdbcTemplate.update()
行を実行するときです。データベースをチェックすると、データはすでに存在しています。さらに、NullPointerException をスローしても、データはデータベースに残ります。
いくつか検索した結果、 を呼び出すことができることがわかりました。値TransactionSynchronizationManager.isActualTransactionActive()
が返されfalse
ます。したがって、注釈が何もしないことは理解していますが、その理由はわかりません。
私は Websphere サーバーで実行しており、データベースは DB2 です。