3

エラーが発生した場合にすべての挿入がロールバックされるトランザクション ブロック内でいくつかの挿入クエリを実行したいと考えています。

MySQLこれには、データベースとSpring TransactionManagerを使用しています。テーブルタイプもInnoDB

ここに記載されている手順に従って、構成を完了しました。

以下は私のコードです(今のところクエリは1つだけです)

TransactionDefinition def = new DefaultTransactionDefinition();
TransactionStatus status = null;

status = transactionManager.getTransaction(def);
jdbcTemplate.execute(sqlInsertQuery);
transactionManager.rollback(status);

春の設定xml:

<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
    <property name="dataSource">
        <ref bean="dataSource" />
    </property>
</bean>

<bean id="transactionManager"
    class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource" />
</bean>

データソース構成:

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
    <property name="driverClassName" value="${jdbc.driverClassName}" />
    <property name="url" value="${jdbc.url}" />
    <property name="username" value="${jdbc.username}" />
    <property name="password" value="${jdbc.password}" />
    <property name="initialSize" value="${jdbc.initialSize}" />
    <property name="maxActive" value="${jdbc.maxActive}" />
    <property name="minIdle" value="${jdbc.minIdle}" />
    <property name="maxIdle" value="${jdbc.maxIdle}" />
    <property name="testOnBorrow" value="${jdbc.testOnBorrow}" />
    <property name="testWhileIdle" value="${jdbc.testWhileIdle}" />
    <property name="testOnReturn" value="${jdbc.testOnReturn}" />
    <property name="validationQuery" value="${jdbc.validationQuery}" />
    <property name="timeBetweenEvictionRunsMillis" value="${jdbc.timeBetweenEvictionRunsMillis}" />
    <!--<property name="removeAbandoned" value="true"/> <property name="removeAbandonedTimeout" 
        value="10"/> <property name="logAbandoned" value="false"/> -->
    <property name="numTestsPerEvictionRun" value="${jdbc.numTestsPerEvictionRun}" />
</bean>

このコードは問題なく機能し、レコードが挿入されます。しかし、ロールバックは機能しません!エラーなしでロールバックステートメントを実行しますが、効果はありません。

誰かが私がどこで間違っているのか教えてもらえますか?

4

2 に答える 2

4

問題は、データソースが自動コミットをオフにするように設定されていないようです。

<property name="defaultAutoCommit" value="false"/>

試してみてください。私はプロキシの外部で TransactionManager を使用したことがないので、このように直接使用する他の落とし穴があるかどうかはわかりませんが、AOP トランザクションまたは便利な AOP プロキシ アノテーション @Transactional を参照することをお勧めします。 .

于 2013-04-26T13:19:05.303 に答える