关于Spring 中的事务

Spring中配置事务的方式有两种:xml配置事务,注解式事务

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

A.xml配置事务

    eg:  

                   <tx:advice id="transactionAdvice" transaction-manager="transactionManager">
                           <tx:attributes>
                                   <tx:method name="get*" read-only="true" propagation="REQUIRED" />
                                  <tx:method name="delete*" propagation="REQUIRED" />
                                  <tx:method name="update*" propagation="REQUIRED" />
                                  <tx:method name="insert*" propagation="REQUIRED" />
                                  <tx:method name="*" propagation="REQUIRED" />
                          </tx:attributes>
                   </tx:advice>
                  <aop:config>
                           <aop:pointcut id="transactionPointCut" expression="execution(* com.zgj.service..*.*(..))"/>
                           <aop:advisor pointcut-ref="transactionPointCut" advice-ref="transactionAdvice"/>
                  </aop:config>

 <tx:method/> 有关的设置

属性是否需要?默认值描述
name  

与事务属性关联的方法名。通配符(*)可以用来指定一批关联到相同的事务属性的方法。 如:'get*''handle*''on*Event'等等。

propagation REQUIRED 事务传播行为
isolation DEFAULT 事务隔离级别
timeout -1 事务超时的时间(以秒为单位)
read-only false 事务是否只读?
rollback-for  

将被触发进行回滚的 Exception(s);以逗号分开。 如:'com.foo.MyBusinessException,ServletException'

no-rollback-for  

 被触发进行回滚的 Exception(s);以逗号分开。 如:'com.foo.MyBusinessException,ServletException'

Spring在TransactionDefinition接口中规定了7种类型的事务传播行为,它们规定了事务方法和事务方法发生嵌套调用时事务如何进行传播:

事务传播行为类型

说明

PROPAGATION_REQUIRED

如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择。

PROPAGATION_SUPPORTS

支持当前事务,如果当前没有事务,就以非事务方式执行。

PROPAGATION_MANDATORY

使用当前的事务,如果当前没有事务,就抛出异常。

PROPAGATION_REQUIRES_NEW

新建事务,如果当前存在事务,把当前事务挂起。

PROPAGATION_NOT_SUPPORTED

以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。

PROPAGATION_NEVER

以非事务方式执行,如果当前存在事务,则抛出异常。

PROPAGATION_NESTED

如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类 似的操作。

 

<aop:config> 中expression说明
                    任意公共方法的执行:
                    execution(public * *(..))
                    任何一个以“set”开始的方法的执行:
                    execution(* set*(..))
                    AccountService 接口的任意方法的执行:
                    execution(* com.xyz.service.AccountService.*(..))
                    定义在service包里的任意方法的执行:
                    execution(* com.xyz.service.*.*(..))
                    定义在service包和所有子包里的任意类的任意方法的执行:
                    execution(* com.xyz.service..*.*(..))
                    定义在pointcutexp包和所有子包里的JoinPointObjP2类的任意方法的执行:
                    execution(* com.test.spring.aop.pointcutexp..JoinPointObjP2.*(..))")
                    ***> 最靠近(..)的为方法名,靠近.*(..))的为类名或者接口名,如上例的JoinPointObjP2.*(..))
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
B.注解式事务
               eg:
                   <tx:annotation-driven transaction-manager="transactionManager" />
 
 
C.事务说明
 
   因是在service上加入的事务,当时环境是mybatis环境,当在一个有REQUIRED事务的service中进行

         userMapper.addUser(user);
         userMapper.deleteUserById(1);

        当有一个有异常的时候两个都变现为不成功

 
 
posted @ 2015-11-04 17:05  张广举  阅读(163)  评论(0编辑  收藏  举报