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>

看起来 prcessTransaction 方法不仅是一个事务,而且是多个事务的集合。

我正在使用 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 注释应用于具有公共可见性的方法。如果您使用 @Transactional 注释对受保护的、私有的或包可见的方法进行注释,则不会引发错误,但带注释的方法不会显示配置的事务设置。如果您需要注释非公共方法,请考虑使用 AspectJ(见下文)。

于 2011-08-17T12:03:45.737 回答
0

我们遇到了类似的问题,但是在一个更复杂的环境中,我们有 2 个数据库,每个数据库都有自己的事务管理器。我们让它工作的唯一方法是在@Transactional("transactionManager")注解上指定事务管理器实例。

它有效,尽管我不满意,因为我不明白为什么我们需要在注释上显式指定事务管理器。

于 2011-08-17T10:44:18.673 回答