2011-08-16 6 views
2

私はトランザクションをセットアップしようとしていますが、成功していません。ここ は私のコードです:myBatisとSpringでトランザクションをセットアップする方法

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

そのprcessTransaction方法1つのトランザクションが、複数のトランザクションのセットだけではないように見えます。

私は、Oracle 11.1.0.6.0、助けのための

おかげで春3.0.5、MyBatisの3.0.4、MyBatisのスプリング-1.0.1、Tomcatの7.0.19を使用しています。

+0

あなたは 'getSqlMapClientTemplate'(Spring API)を呼び出しているのですか、iBATIS APIを使ってiBATIS呼び出しを発行していますか? – atrain

+0

私はiBatisコールを使用しています。 – user802293

+0

データベースはトランザクションをサポートしていますか? – kurochenko

答えて

0

私たちは同様の問題を抱えていましたが、より複雑な環境では、それぞれに独自のトランザクションマネージャを持つ2つのデータベースがあります。私たちが動作させる唯一の方法は、@Transactional("transactionManager")注釈でトランザクションマネージャのインスタンスを指定することでした。

私は注釈でトランザクションマネージャを明示的に指定する必要がある理由がわからないので、私は満足できません。プライベートメソッドに@Transactional置く

3

が問題に見える、the Spring documentationは言う:(デフォルト)プロキシモードで

を、唯一の外部メソッドは、プロキシ経由で入ってくるが傍受されて呼び出します。つまり、ターゲットオブジェクトの別のメソッドを呼び出すターゲットオブジェクト内のメソッドを実際に呼び出すと、呼び出されたメソッドが@Transactionalでマークされていても、実行時に実際のトランザクションにつながることはありません。

同じセク​​ションはさておき、これを持っている:

メソッドの可視性と@Transactional

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

関連する問題