spring + ibatis 整合后,事务的问题

  • ibatis独立事务处理

   String resource="SqlMapConfig.xml";
    Reader reader = null;
    try {
       reader = Resources.getResourceAsReader(resource);
    } catch (IOException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }
    SqlMapClient smc = SqlMapClientBuilder.buildSqlMapClient(reader);

    

  •    spring编程事务处理

transactionTemplate = (TransactionTemplate)factory.getBean("transactionTemplate");
        List<Testtb> tbs = null;
        tbs = transactionTemplate.execute(new TransactionCallback(){
                public Object doInTransaction(TransactionStatus ts){
                try
                {

                
                 }
                catch (Exception e)
                {
                     ts.setRollbackOnly();
                }
                finally
                {
                                   }
             }
         });

 

  • spring 声明事务

<?xml version="1.0" encoding="UTF-8"?>
<beans
    xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">

<bean id="propertyConfig" 
  class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
  <property name="location"> 
   <value>jdbc.properties</value> 
  </property> 
</bean> 
 

<bean id="dataSource"
  class="org.springframework.jndi.JndiObjectFactoryBean">
  <property name="jndiName">
  <value>java:comp/env/jdbc/mysqlDB</value>
  </property>
  </bean>
  <!--
<bean id="dataSource" 
  class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
  <property name="driverClassName"> 
   <value>${jdbc.driver}</value> 
  </property> 
  <property name="url"> 
   <value>${jdbc.url}</value> 
  </property> 
  <property name="username"> 
   <value>${jdbc.username}</value> 
  </property> 
  <property name="password"> 
   <value>${jdbc.password}</value>  
  </property> 
</bean> 
  -->

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
      <property name="dataSource" ref="dataSource" /> 
</bean>

<bean id="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate">
    <property name="transactionManager" ref="transactionManager"/>
</bean>

<aop:config>
   <aop:pointcut  id="pointcut1" expression="execution(* com.ibc.service.*.*(..))"/>
   <aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut1"/>
</aop:config>

<tx:advice id="txAdvice" transaction-manager="transactionManager">
   <tx:attributes>
    <tx:method name="InsertSomedata" isolation="READ_COMMITTED" propagation="REQUIRED" rollback-for="java.lang.Exception"/>
   </tx:attributes>
</tx:advice>

<tx:annotation-driven transaction-manager="transactionManager"/>

<bean id="transactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor">  
    <property name="transactionManager" ref="transactionManager" />  
    <property name="transactionAttributes">  
    <props>  
        <prop key="InsertSomedata">PROPAGATION_REQUIRED,-Exception</prop>  
    </props>  
    </property>  
</bean>

<!--绿色部分任选一种方法即可--> 

<!--
<bean id="beanNameAutoProxyCreator" class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"> 
    <property name="beanNames">
     <list>
         <value>testDatabaseImpl1</value>
     </list>
     </property> 
    <property name="interceptorNames"><value>transactionInterceptor</value></property> 
</bean> 
-->

 
<bean id="sqlMapClient" 
  class="org.springframework.orm.ibatis.SqlMapClientFactoryBean"> 
  <property name="configLocation"> 
   <value>SqlMapConfig.xml</value> 
  </property> 
  <property name="dataSource"> 
   <ref bean="dataSource" /> 
  </property> 
</bean> 
 

<bean id="sqlMapClientTemplate" 
  class="org.springframework.orm.ibatis.SqlMapClientTemplate"> 
  <property name="sqlMapClient"> 
   <ref bean="sqlMapClient" /> 
  </property> 
</bean> 

<!--

public class TestDatabaseImpl extends SqlMapClientDaoSupport implements TestDatabase

{

}

(1)这个class必须继承于SqlMapClientDaoSupport , spring 才能管理ibatis的事务。

(2)另外方法中不能自己try、catch拦截异常。

上述两点是网上很多帖子询问的“回滚不了”的原因。

--> 

<bean id="testDatabaseImpl1"    class="com.ibc.service.TestDatabaseImpl">
<property name="sqlMapClientTemplate"> 
   <ref bean="sqlMapClientTemplate" /> 
  </property>
</bean>

 

</beans>

posted @ 2013-01-12 15:20  金鳞岂是池中物  阅读(422)  评论(0编辑  收藏  举报