关于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>
Spring在TransactionDefinition接口中规定了7种类型的事务传播行为,它们规定了事务方法和事务方法发生嵌套调用时事务如何进行传播:
<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);
当有一个有异常的时候两个都变现为不成功
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
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' |
事务传播行为类型 | 说明 |
PROPAGATION_REQUIRED | 如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择。 |
PROPAGATION_SUPPORTS | 支持当前事务,如果当前没有事务,就以非事务方式执行。 |
PROPAGATION_MANDATORY | 使用当前的事务,如果当前没有事务,就抛出异常。 |
PROPAGATION_REQUIRES_NEW | 新建事务,如果当前存在事务,把当前事务挂起。 |
PROPAGATION_NOT_SUPPORTED | 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。 |
PROPAGATION_NEVER | 以非事务方式执行,如果当前存在事务,则抛出异常。 |
PROPAGATION_NESTED | 如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类 似的操作。 |
任意公共方法的执行:
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);
当有一个有异常的时候两个都变现为不成功
相关文章推荐
- Java EE (12) -- 系统质量的分类
- List存储Java对象
- Java关键字this、super使用总结
- 全面分析Java的垃圾回收机制
- Java并发编程实践 -- Executor框架
- java中堆和栈的区别
- Java基础之String中equals,声明方式,等大总结
- spring mvc controller间跳转 重定向 传参
- Java动态代理
- springMVC+Spring3+hibernate4整合实现增删改查demo
- JAVA JDK版本切换
- Spring笔记——事务
- java中转换成字符串的方法
- Java 编程的动态性,第 8 部分: 用代码生成取代反射
- java中判断字符串是否为数字的三种方法
- Java 编程的动态性,第 7 部分: 用 BCEL 设计字节码
- Java 编程的动态性,第 6 部分: 利用 Javassist 进行面向方面的更改
- java的继承的宗旨
- java 以追加形式写txt文件
- Java 编程的动态性,第 5 部分: 动态转换类