事务处理是spring核心的一部分,这次参考的是spring-tx-3.0.xsd
advice
advice是事务处理的主要的节点,他是AOP的一个扩展,AOP面向切面 ,而advice处理事务也是通过aop切面实现的,我们知道aop处理时,需要定义切面类,但事务是AOP一种应用,所以他使用的是TransactionInterceptor这个类来实现事务处理
支持两个节点属性id和transaction-manager
id:advice的唯一性,在逻辑上可能没有什么太多的用处
transaction-manager:事务管理器,如果这个属性没有传,则默认为
transaction-manager="transactionManager",这个里面配置的是事务管理器的bean
这个类需要是PlatformTransactionManager的子类,可以自己定制,但这里需要自己配置springBean,
再看一下他的子节点。
在spring处理advice时,子节点,最多只能有一个attribute的子节点。如果没有可以默认,如果多个,spring启动将直接报错
Attribute有一个子节点节,method,如上图所示,可以看出,method可以支持多个的,是一对多的关系。
Name:name也是支持表达式,他是一系列method的名称。
Propagation:事务一致性,参见下面的列表 ,(这个是我从某博客上贴过来的http://www.blogjava.net/wmcoo/articles/333831.html,也可以参考spring源码TransactionDefinition.java),默认为PROPAGATION_REQUIRED
PROPAGATION_REQUIRED:支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。
PROPAGATION_SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行。
PROPAGATION_MANDATORY:支持当前事务,如果当前没有事务,就抛出异常。
PROPAGATION_REQUIRES_NEW:新建事务,如果当前存在事务,把当前事务挂起。
PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。
PROPAGATION_NESTED:支持当前事务,如果当前事务存在,则执行一个嵌套事务(还不是太明白),如果当前没有事务,就新建一个事务。
Isolation:这个与Propagation一样,我从某博客上贴出来的,同样可以参考spring源码TransactionDefinition.java,默认为DEFAULT
1 ISOLATION_DEFAULT 默认的隔离级别
下面几个都是 JDBC isolation levels 一一对应:
2 ISOLATION_READ_UNCOMMITTED Connection.TRANSACTION_READ_UNCOMMITTED
指示防止发生脏读的常量;不可重复读和虚读有可能发生。
3 ISOLATION_READ_COMMITTED Connection.TRANSACTION_READ_COMMITTED
指示可以发生脏读 (dirty read)、不可重复读和虚读 (phantom read) 的常量。
4 ISOLATION_REPEATABLE_READ Connection.TRANSACTION_REPEATABLE_READ
指示防止发生脏读和不可重复读的常量;虚读有可能发生。
5 ISOLATION_SERIALIZABLE Connection.TRANSACTION_SERIALIZABLE
指示防止发生脏读、不可重复读和虚读的常量。
Timeout:事务超时,默认-1,无超时,单位为秒
read-only:默认为false,表示是否支持只读着事物,他是事务的一种属性,如果为true,如果出现操作类型的,将会报错
rollback-for:在sprring的处理中,如果遇到runtimeException便会回滚,当然spring支持自定义,当抛出特定的异常时,便才回滚事务,其它异常数据不回滚
no-rollback-for:同理,控制哪些特定的异常不回滚事务。其它异常回滚事务。
jta-transaction-manager:
看图可看出,其实这个节点什么都没有,所以在声明时只需要这样就可以了
<tx:jta-transaction-manager></tx:jta-transaction-manager>
便可实现 。其实内部看到配置了jta,就会自动生成一条名为transactionManager的springbean,通过jta管理事务,默认为:
org.springframework.transaction.jta.JtaTransactionManager
现在我们想想之前transaction-manager,便可知道他们可以搭配使用
annotation-driven
这里是通过注解方式对事物进行管理的一种声明。
Mode:事务方式,有两种取值,aspectj和proxy,默认是代理模式
transaction-manager:与advice中的transaction-manager方式一样的。
proxy-target-class:true和false两种,默认为false,表示是否启用代理,当然这个只会在mode=”proxy”情况下才会读取,如果为false,那么默认代理 ,如果为true,可能就需要自动生成 代理 类,可能 需要CGLIB能力。
Order:与上一篇AOP说的order一样。
总结:
其它上面做的东西,都是事务的一种声明或定义,刚开始也说了,他只是一种AOP的实例,如果要在流程中使用,还是要通过配置切面真正的使用起来。可以在aop:config中advice-ref去引用。