2011-08-16 26 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(請參見下文)。

相關問題