您的位置:首页 > 编程语言 > Java开发

关于Spring 中的事务

2015-11-04 17:05 375 查看
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);

当有一个有异常的时候两个都变现为不成功
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: