Spring AOP 事务管理
来源:互联网 发布:golang defer panic 编辑:程序博客网 时间:2024/04/29 04:54
首先需要配置一个 Bean 称之为事务管理器。有DataSourceTransactionManager、HibernateTransactionManager等。
然后用tx:advice标签配置事务。tx即是transaction的简写。定义事务属性:传播、隔离级别、读写、超时、异常。
最后用 aop 方式配置添加事务的切点。
<!-- 事务管理器 --> <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> </bean> <!-- 事务 --> <tx:advice id="txAdvice" transaction-manager="txManager"> <tx:attributes> <tx:method name="query*" read-only="true" /> <tx:method name="find*" read-only="true" /> </tx:attributes> </tx:advice> <!-- 使用事务的切点 --> <aop:config> <aop:advisor advice-ref="txAdvice" pointcut="execution(* *..service..*.*(..))"/> </aop:config>
<tx:method/>
标签的属性
name:方法名的匹配模式,通知根据该模式寻找匹配的方法。
propagation:设定事务定义所用的传播级别。
isolation:设置事务的隔离级别。
timeout:指定事务的超时(秒)。
read-only:该属性为true指示事务是只读的
no-rollback-for:以逗号分隔的异常类的列表,目标方法可以跑出这些异常而不会导致通知执行回滚
rollback-for:以逗号分隔的异常类的列表,当目标方法跑出这些异常时会导致通知执行回滚。默认情况下,该列表为空,因此不在no-rollback-for列表中的任何运行时异常都会导致回滚。
isolation隔离级别
ISOLATION_DEFAULT 默认级别(对大多数数据库来说就是ISOLATION_READ_COMMITTED)
ISOLATION_READ_UNCOMMITTED 最低的隔离级别。事实上我们不应该隔离级别,因为在事务完成前,其他事务可以看到该事务所修改的数据。而在其他事务提交前,该事务也可以看到其他事务所做的修改。
ISOLATION_READ_COMMITTED 大多数数据库的默认级别。在事务完成前,其他事务无法看到该事务所修改的数据。遗憾的是,在该事务提交后,你就可以查看其他事务插入活更新的数据。这意味着在事务的不同点上,如果其他事务修改数据,你会看到不同的数据。
ISOLATION_REPEATABLE_READ 该隔离级别确保如果在事务中查询了某个数据集,你至少还能再次查询到相同的数据集,即使其他事务修改了所查询的数据。然而如果其他事务插入了新数据,你就可以查询到该新插入的数据。
ISOLATION_SERIALIZABLE 代价最大、可靠性最高的隔离级别,所有的事务都是俺顺序一个接一个的执行。
propagation传播行为
PROPAGATION_REQUIRED 当前如果有事务,Spring就会使用该事务;否则会开始一个新事务。
PROPAGATION_SUPPORTS 当前如果有事务,Spring就会使用该事务;否则不会开启一个新事务。
PROPAGATION_MANDATORY 当前如果有事务,Spring就会使用该事务;否则会抛出异常。
PROPAGATION_REQUIRES_NEW Spring总会开始一个新事务。如果当前有事务,则该事务挂起。
PROPAGATION_NOT_SUPPORTED Spring不会执行事务中的代码。代码总是在非事务环境下执行,如果当期有事务,则该事务挂起。
PROPAGATION_NEVER 即使当前有事务,Spring也会在飞事务环境下执行。如果当前有事务,则抛出异常。
PROPAGATION_NESTED 如果当前有事务,则在嵌套事务中执行。如果没有,那么执行情况与PROPAGATION_REQUIRED一样。
Spring AOP 执行表达式 execution 格式
execution(modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern) throws-pattern?)
modifiers-pattern 表示public、protected等,省略则表示任意。
ret-type-pattern 表示返回值类型,不能省略,用 * 匹配任意。
declaring-type-pattern 表示包路径和类名称,省略则表示任意。
name-pattern 表示方法名称,不能省略,用 * 匹配任意。
param-pattern 表示参数,不能省略,用 .. 匹配任意,用 * 匹配一个参数。
throws-pattern 表示异常,省略则表示任意。
下面给出一些通用切入点表达式的例子。
execution(public * *(..)) 任意公共方法
execution(* set*(..)) 任何一个名字以“set”开始的方法
execution(* com.xyz.service.AccountService.*(..) AccountService接口定义的任意方法
execution(* com.xyz.service..(..)) 在service包中定义的任意方法
execution(* com.xyz.service...(..)) 在service包或其子包中定义的任意方法
- spring事务管理,AOP模式
- spring aop事务管理配置
- Spring Aop事务管理
- Spring AOP 事务管理
- spring aop事务管理
- spring aop xml事务管理
- spring aop 事务管理
- Spring事务管理、Aop
- Spring事务管理——AOP注解事务管理
- spring事务管理AOP (mini show)
- Spring事务管理-aop切入配置
- 【spring】中的事务管理AOP配置.
- Spring事务管理—AOP/Annotation
- Spring的AOP和事务管理机制概览
- Spring的AOP和事务管理机制概览
- spring事务管理的AOP实现原理
- Spring的AOP和事务管理机制概览
- Spring的AOP和事务管理机制概览
- javascript中window.event事件用法详解
- Strategy Pattern 策略模式
- 自定义jstl fn函数fns
- Android RecyclerView 使用完全解析 体验艺术般的控件
- julia :谈循还,row 与 col who first?
- Spring AOP 事务管理
- 返回键的处理,以及退出程序
- Unity3D-DoTween
- namespace详解
- Linux多线程消费者和生产者模型实例(互斥锁和条件变量使用)
- VS2012 + IIS Web 发布(二)——开启IIS
- Scala:Function1、Function2
- yii2的基础操作
- AFNetworking和SDWebImage实现原理