2

トランザクションを設定しようとしていますが、成功しません。これが私のコードです:

<tx:annotation-driven transaction-manager="transactionManager" />

<bean id="dataSource" class="org.apache.ibatis.datasource.pooled.PooledDataSource">
   .......
   <property name="defaultAutoCommit" value="false" />
</bean>

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

 <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
   <property name="configLocation" value="classpath:mybatis-configuration.xml" />
   <property name="dataSource" ref="dataSource" />
</bean>

@Transactional
private void prcessTransaction(...) {
 delete(...);
 //insert:
 for(Item item: itemList){
   insert(item)
 }
}

<delete id="delete" parameterType="map">
    delete from .....
  </delete>

<insert id="insert" parameterType="Item">
    insert into ....
  </insert>

その processTransaction メソッドは、1 つのトランザクションだけでなく、複数のトランザクションのセットのようです。

Spring 3.0.5、myBatis 3.0.4、mybatis-spring-1.0.1、Tomcat 7.0.19、Oracle 11.1.0.6.0 を使用しています。

手伝ってくれてありがとう。

4

2 に答える 2

3

@transactional をプライベート メソッドに配置すると問題があるように見えます。Springのドキュメントには次のように書かれています。

プロキシ モード (デフォルト) では、プロキシ経由で着信する外部メソッド呼び出しのみがインターセプトされます。つまり、自己呼び出し、つまり、ターゲット オブジェクト内のメソッドがターゲット オブジェクトの別のメソッドを呼び出している場合、呼び出されたメソッドが @Transactional でマークされていても、実行時に実際のトランザクションは発生しません。

同じセクションにはこれがあります:

メソッドの可視性と @Transactional

プロキシを使用する場合は、@Transactional アノテーションを public な可視性を持つメソッドにのみ適用する必要があります。@Transactional アノテーションを使用して、保護されたプライベート メソッドまたはパッケージ可視メソッドにアノテーションを付けた場合、エラーは発生しませんが、アノテーションが付けられたメソッドは、構成されたトランザクション設定を示しません。非公開メソッドに注釈を付ける必要がある場合は、AspectJ (以下を参照) の使用を検討してください。

于 2011-08-17T12:03:45.737 に答える
0

同様の問題が発生しましたが、それぞれ独自のトランザクションマネージャーを持つ2つのデータベースがあるより複雑な環境で発生しました。@Transactional("transactionManager")それを機能させる唯一の方法は、アノテーションでトランザクションマネージャーインスタンスを指定することでした。

アノテーションでトランザクションマネージャーを明示的に指定する必要がある理由がわからないため、満足できませんが、機能します。

于 2011-08-17T10:44:18.673 に答える