Spring支持对不同方式的事物支持
Spring声明式事物
声明式事务管理也有两种常用的方式,一种是基于tx和aop名字空间的xml配置文件,另一种就是基于@Transactional注解。显然基于注解的方式更简单易用,更清爽。
aop方式:
org.springframework.tranaction.PlatformTransactionManager接口是spring提供的所有事物管理的基本,定义了commit()rollback()等方法。以下都是该接口的实现
对jdbc的DataSourceTransactionManager
对Hibernate的HibernateTransactionManager
对JTA的JtaTransactionManager
对Jdo的JdoTransactionManager
对WebLogic的WebLogicJtaTransactionManager
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref local="sessionFactory" />
</property>
</bean>
以上是Spring整合hibernate,对事物的支持配置,如果换成是JTA,替换Hibernate,则
<bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager">就行
Spring支持声明式事物和编程式事物
(1)声明式事物
声明式事物有两种方式配置
1,TransactionInterceptor结合ProxyFactoryBean
2,TransactionProxyFactoryBean
1,TransactionInterceptor结合ProxyFactoryBean
TransactionProxyFactoryBean指定代理bean,
以上这段配置意思是:
Spring AOP实现的拦截器只能拦截方法级调用,因此,这种事物是方法级的,即整个方法处于事物中。
@Transactional注解
需要在Spring配置文件中配置
jdbc数据
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
@Transactional 可以作用于接口、接口方法、类以及类方法上。当作用于类上时,该类的所有 public 方法将都具有该类型的事务属性,同时,我们也可以在方法级别使用该标注来覆盖类级别的定义。
虽然 @Transactional 注解可以作用于接口、接口方法、类以及类方法上,但是 Spring 建议不要在接口或者接口方法上使用该注解,因为这只有在使用基于接口的代理时它才会生效。另外, @Transactional 注解应该只被应用到 public 方法上,这是由 Spring AOP 的本质决定的。如果你在 protected、private 或者默认可见性的方法上使用 @Transactional 注解,这将被忽略,也不会抛出任何异常。
默认情况下,只有来自外部的方法调用才会被AOP代理捕获,也就是,类内部方法调用本类内部的其他方法并不会引起事务行为,即使被调用方法使用@Transactional注解进行修饰。