В моем приложении, у меня есть 2 TransactionManager, созданные, как это:Не удается открыть сделку Spring путем аннотирования
<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"/>
Для того, чтобы просто удобство моего администратора TransactionManager, я создал простую аннотацию:
@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
}
Этот метод вызывается из другого класса благодаря интерфейсу. Компонент был добавлен Spring @Autowired аннотацией. Объект jdbcTemplate
был создан с помощью этого кода:
@Autowired
@Qualifier("adminDataSource")
public void setDataSource(DataSource dataSource) {
this.jdbcTemplate = new NamedParameterJdbcTemplate(dataSource);
}
Моя проблема когда я выполняю jdbcTemplate.update()
линию, если я проверить свою базу данных, данные уже присутствуют. Кроме того, даже если я выбрал исключение NullPointerException, данные остаются в базе данных.
После некоторого поиска я обнаружил, что мы можем позвонить TransactionSynchronizationManager.isActualTransactionActive()
, и он возвращает мне значение false
. Итак, я понимаю, что моя аннотация ничего не делает, но я не могу понять, почему.
Я работаю на сервере Websphere, а база данных - DB2.