<!-- 定义事务通知 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<!-- 定义方法的过滤规则 -->
<tx:attributes>
<tx:method name="delete*" propagation="REQUIRED" read-only="false"
rollback-for="java.lang.Exception"/>
</tx:attributes>
</tx:advice>
<!-- 定义AOP -->
<aop:config>
<aop:advisor
pointcut="execution(* org.jsoft.service.impl..*.*(..))" advice-ref="txAdvice" />
</aop:config>
tx:method标签属性说明
name
必须配置,与事务关联的方法名rollback-for
可不配置。- 默认对RuntimeException()异常极其子类进行事务回滚
- 表示将被触发进行回滚的 Exception(s);以逗号分开。
- 配置为rollback-for=”java.lang.Exception”,表示让非运行时异常也回滚。
- 通常都配置成rollback-for=”java.lang.Exception”,表示只要发生异常就回滚。
如:’com.foo.MyBusinessException,ServletException’
propagation
可不配置,事务的传播性,默认值是REQUIREDREQUIRED:如果存在一个事务,则支持当前事务。如果没有事务则开启。
SUPPORTS:该方法在某个事务范围内被调用,则方法成为该事务的一部分。如果方法在该事务范围外被调用,该方法就在没有事务的环境下执行。
MANDATORY:该方法只能在一个已经存在的事务中执行,业务方法不能发起自己的事务。如果在没有事务的环境下被调用,容器抛出例外。
REQUIRES_NEW:总是开启一个新的事务。如果一个事务存在,则将这个存在的事务挂起。
NOT_SUPPORTED:总是非事务地执行,并挂起任何存在的事务。
NEVER:总是非事务地执行,如果存在一个活动事务,则抛出异常。
NESTED:如果一个活动的事务存在,则运行在一个嵌套的事务中,如果没有活动事务,则按TransactionDefinition.PROPAGATION_REQUIRED属性执行
isolation
可不配置。表示事务隔离级别(数据库的隔离级别),默认值DEFAULTtimeout
可不配置,表示事务超时的时间(以秒为单位),默认值-1(永不超时)read-only
可不配置,表示事务是否只读,默认值false
此配置是对jdbc的Connection.setReadOnly()的封装,如果设置为true(只读事务),提示数据库驱动程序和数据库系统,这个事务并不包含更改数据的操作,那么JDBC驱动程序和数据库就有可能根据这种情况对该事务进行一些特定的优化,比方说不安排相应的数据库锁,以减轻事务对数据库的压力,毕竟事务也是要消耗数据库的资源的。
注意:oracle数据库中也read-only,但此处的配置与oracle的read-only不是一个意思
no-rollback-for
可不配置,- 表示不被触发进行回滚的异常;以逗号分开。
- 配置为no-rollback-for=”java.lang.RuntimeException”,表示让运行时异常不回滚。
如:’com.foo.MyBusinessException,ServletException’
感谢以下链接
http://san-yun.iteye.com/blog/494405
https://www.cnblogs.com/hackem/p/3890656.html
http://blog.csdn.net/u013486840/article/details/51546335
http://blog.csdn.net/seng3018/article/details/6690587