不要设法通过注释打开Spring事务

时间:2013-06-26 15:55:52

标签: db2 websphere spring-transactions

在我的应用程序中,我有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"/>

为了简化我的admin transactionManager的可用性,我创建了一个简单的Annotation:

@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。

1 个答案:

答案 0 :(得分:0)

经过一番搜索,我终于找到了问题,所以如果有人有兴趣我发帖吧: 这是由Spring生成的bean,不使用XML特定的声明,而是使用Spring扫描。

当我尝试在XML文件中声明我的bean然后在AutowiredQualifier的类中注入它时,事务最终打开和关闭。

顺便说一句,我不知道原因。