0

私のアプリケーションでは、次のように作成された 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 です。

4

1 に答える 1

0

いくつかの検索の後、私は最終的に問題を見つけたので、誰かが興味を持っている場合は投稿します.XML固有の宣言を使用せず、Springスキャンを使用してSpringによって生成されたBeanでした。

XML ファイルで自分の Bean を宣言しようとした後、 and を使用してクラスに注入するAutowiredQualifier、トランザクションが最終的に開いて閉じます。

ちなみに理由はわかりません。

于 2013-07-04T09:24:45.810 に答える