2011-08-16 54 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方法不仅是交易,但多套成交。

我使用Spring 3.0.5,3.0.4的MyBatis,MyBatis的弹簧-1.0.1,Tomcat的7.0.19,甲骨文11.1.0.6.0

感谢您的帮助。

+0

你在调用'getSqlMapClientTemplate'(Spring API)还是使用iBATIS API发出iBATIS调用? – atrain

+0

我正在使用iBatis调用。 – user802293

+0

您的数据库是否支持交易? – kurochenko

回答

0

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

它的工作,虽然我不满意,因为我不明白为什么我们需要明确指定注释事务管理器。

3

上的私有方法把@Transactional看起来有问题,the Spring documentation说:

在代理模式(这是默认值),只有外部方法调用通过代理来在被截获。这意味着即使被调用的方法标记为@Transactional,实际上,自调用目标对象内的方法调用目标对象的另一个方法也不会导致实际的事务处理。

同一节有这样的旁白:

方法的知名度和@Transactional

当使用代理服务器,你应该申请@Transactional注释仅与公众知名度的方法。如果使用@Transactional批注对受保护的,私有的或包视可见的方法进行注释,则不会引发错误,但注释的方法不会显示已配置的事务设置。如果您需要注释非公共方法,请考虑使用AspectJ(请参见下文)。

相关问题