使用Spring的AOP支持,配置声明式事务。——这是最好的解决方案。

解决方案 »

  1.   


    具体使用的例子吗?下边就是。1.x的配置方式,也许有点过时了,却一样实用,而且更容易理解。
    只需要在Spring的文件中写配置即可,你的源代码中不需要任何与事务相关的语句。——这就是AOP的威力:可以在不改源代码的基础上加入新的功能。我担心的是,光看这个,一点都起不到作用。
    楼主去网上搜搜AOP、声明式事务的介绍和示例吧,挺多的。呵呵。
      <!-- 给业务类配置声明式事务 --> <bean abstract="true" name="serviceTemplate" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
    <property name="transactionManager" ref="txManager"></property>
    <property name="transactionAttributes">
    <props>
    <prop key="add*">PROPAGATION_REQUIRED</prop>
    <prop key="del*">PROPAGATION_REQUIRED</prop>
    <prop key="mod*">PROPAGATION_REQUIRED</prop>
    <prop key="*">PROPAGATION_SUPPORTS, readOnly</prop>
    </props>
    </property>
    </bean>

    <bean parent="serviceTemplate" name="userService" >
    <property name="target" ref="userServiceTarget" />
    </bean>

    <bean name="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory" />
    </bean>

    <bean name="userServiceTarget" class="biz.UserService">
    <property name="userDao" ref="userDao" />
    </bean>
      

  2.   

    <bean id="jtaTransactionManager"
    class="org.springframework.transaction.jta.JtaTransactionManager" />
    <bean id="baseTxProxy" lazy-init="true"
    class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
    <property name="transactionManager">
    <ref bean="jtaTransactionManager" />
    </property>
    <property name="transactionAttributes">
    <props>
    <prop key="add*">PROPAGATION_REQUIRED</prop>
    <prop key="update*">PROPAGATION_REQUIRED</prop>
    <prop key="del*">PROPAGATION_REQUIRED</prop>
    <prop key="*">PROPAGATION_REQUIRED,readOnly</prop>
    </props>
    </property>
    </bean>
    <bean id="testService" parent="baseTxProxy">
    <property name="target">
    <bean class="com.kuke.test.service.TestService">
    <property name="testDAO" ref="testDAO"></property>
    </bean>
    </property>
    </bean>
      

  3.   

    以上的是源码~连接数据库的是spring的jdbc连接的~~
      

  4.   

    public interface TestService { ... }
    public class TestServiceImpl implements TestService { ... }
    <bean id="testService" parent="baseTxProxy"> 
      <property name="target"> 
        <bean class="com.kuke.test.service.TestServiceImpl"> 
          <property name="testDAO" ref="testDAO"></property> 
        </bean> 
      </property> 
    </bean>
    最后调用:
    TestService testService = (TestService)xxxx.getBean("testService");
    testService.addXxxx(...);
      

  5.   

    核心点:
    1) SPRING的事务的执行,是以其配置的方法为单位
    2) 想要借助SPRING的配置事务,只要继承自SPRING FRAMEWORK的DataAccessException,把其抛出,在SERVICE方法执行过程中,一旦遇到该类型异常,即回滚具体代码楼上已有类似的,就不再帖CODE了;
      

  6.   

    能不能说的具体点啊
    关键是我现在的配置方法,tomcat启动不了
    报错啊
    org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jtaTransactionManager' defined in ServletContext resource [/WEB-INF/config/spring/spring-base.xml]: Invocation of init method failed; nested exception is org.springframework.transaction.TransactionSystemException: JTA UserTransaction is not available at JNDI location [java:comp/UserTransaction]; nested exception is javax.naming.NamingException: Cannot create resource instance
    Caused by: 
    org.springframework.transaction.TransactionSystemException: JTA UserTransaction is not available at JNDI location [java:comp/UserTransaction]; nested exception is javax.naming.NamingException: Cannot create resource instance
    Caused by: 
    javax.naming.NamingException: Cannot create resource instance
    at org.apache.naming.factory.TransactionFactory.getObjectInstance(TransactionFactory.java:113)
    at javax.naming.spi.NamingManager.getObjectInstance(NamingManager.java:304)
    at org.apache.naming.NamingContext.lookup(NamingContext.java:793)
    at org.apache.naming.NamingContext.lookup(NamingContext.java:140)
    at org.apache.naming.NamingContext.lookup(NamingContext.java:781)
    at org.apache.naming.NamingContext.lookup(NamingContext.java:153)
    at org.apache.naming.SelectorContext.lookup(SelectorContext.java:137)
    at javax.naming.InitialContext.lookup(InitialContext.java:351)
      

  7.   

    <!--Hibernate事务管理配置-->
      <bean id="hibernateTransactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory">
          <ref local="sessionFactory"/>
        </property>
      </bean>
      <bean id="hibernateTransactionProxy" 
      class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"
      abstract="true">
      <property name="transactionManager" ref="hibernateTransactionManager" />
     
      <property name="transactionAttributes">
        <props>
          <prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>
          <prop key="create*">PROPAGATION_REQUIRED,-Exception</prop>
          <prop key="delete*">PROPAGATION_REQUIRED,-Exception</prop>
          <prop key="update*">PROPAGATION_REQUIRED,-Exception</prop>
          <prop key="save*">PROPAGATION_REQUIRED,-Exception</prop>
          <prop key="dispatch*">PROPAGATION_REQUIRED</prop>
          <prop key="receive*">PROPAGATION_REQUIRED</prop>
          <prop key="revert*">PROPAGATION_REQUIRED</prop>
          
          <prop key="*create">PROPAGATION_REQUIRED,-Exception</prop>
        </props>
      </property>
      </bean><!-- /采价任务执行情况    事务在service层/ -->
    <bean id="pcExecuteTaskService" parent="hibernateTransactionProxy">
    <property name="target">
    <bean class="com.zdvictory.wjj.pricegather.service.PcExecuteTaskServiceImpl">
    <property name="pcExecuteTaskDao"><ref bean="pcExecuteTaskDao" /></property>
    <property name="pcTaskInfoDao"><ref bean="pcTaskInfoDao" /></property>
    <property name="pcCollectionPlaceDao"><ref bean="pcCollectionPlaceDao" /></property>
    <property name="pcMerchandiseInfoDao"><ref bean="pcMerchandiseInfoDao" /></property>
    <property name="pcParticularTargetDao"><ref bean="pcParticularTargetDao" /></property>
    <property name="pcColParticularinfoDao"><ref bean="pcColParticularinfoDao" /></property>
    <property name="priceGuideLineDao"><ref bean="priceGuideLineDao"/></property>
    <property name="pcMerchandIsClassDao"><ref bean="pcMerchandIsClassDao"/></property> 
    <property name="logsDao"><ref bean="logsDao"/></property>
    </bean>
    </property>
    </bean>