我正在尝试设置交易但没有成功。 这是我的代码:
<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
感谢您的帮助。
答案 0 :(得分:3)
将@transactional放在私有方法上看起来有问题,the Spring documentation说:
在代理模式(默认设置)下,只拦截通过代理进入的外部方法调用。这意味着实际上,自调用目标对象中的一个方法调用目标对象的另一个方法,即使被调用的方法用@Transactional标记,也不会在运行时导致实际的事务。
同一部分将此放在一边:
方法可见性和@Transactional
使用代理时,您应该仅将@Transactional注释应用于具有公共可见性的方法。如果使用@Transactional注释对带保护的,私有的或包可见的方法进行注释,则不会引发错误,但带注释的方法不会显示已配置的事务设置。如果需要注释非公共方法,请考虑使用AspectJ(见下文)。
答案 1 :(得分:0)
我们遇到了类似的问题,但是在一个更复杂的环境中,我们有两个数据库,每个数据库都有自己的事务管理器。我们让它工作的唯一方法是在@Transactional("transactionManager")
注释上指定事务管理器实例。
它有效,但我不满意,因为我不明白为什么我们需要在注释上明确指定事务管理器。