Spring中,名为spring-tx-4.3.6.RELEASE的jar包,是Spring用于事务管理的依赖包,使用前需要在pom.xml中添加到依赖标签<dependencies>中:
Spring中事务管理实现分为 编程式事务管理 和 声明式事务管理两种,
前者是传统的方式,在业务逻辑中调用事务管理方法;
后者是借助于AOP技术实现的,将事务管理作为一个切面,在适当的切入点进行事务的提交、回滚、获取事务状态、获取事务信息。
一个借助于AOP实现的事务管理demo
!!!注意:(该demo中在accountDao的transfer方法中 添加了int i = 1 / 0这句代码,模拟系统错误,检验事务管理机制):
不要慌,图有点儿大,简单解释一下,图中对比了基于XML文件配置事务、基于注解配置事务管理两种方式(因为AOP的实现方式有基于XML、注解两种):
(1)基于XML文件将事务管理作为切面与目标类关联:
首先,利用tx:advice声明一个事务,并在其子节点(tx:attributes)的 子节点(tx:method)上设置name(事务管理的方法名称)、propagation(传播行为,这个目前我也不是很懂)、isolation(事务隔离级别)、read-only(是否只读) 4个属性。
然后,将刚刚声明的事务,作为作为切面与目标关联。利用aop:config 节点声明一个aop,定义切入点(aop:pointcut)和切面
(aop:advisor),在该切面中,将事务与切入点整合(<aop:advisor advice-ref="txAdvice" pointcut-ref="txPointCut">,其中txAdivce是事务的id值);
(2)基于annotation注解的事务管理:
在配置文件中,只需要定义事务依赖的数据源<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
和事务管理器驱动:<tx:annotation-driven transaction-manager="transactionManager">
这样,从Spring容器获取的目标(accountDao),即是AOP事务管理增强后的实例,调用 实例(accountDao)的 任意方法(因为AOP配置的切入点为指定包下的任意类的任意方法,并且事务管理 的 name 属性也没有限制,所以是任意方法),都会触发事务管理
最后,简单提一下spring-tx-4.3.6.RELEASE这个jar包中的三个主要接口:
1.Platform TransactionManager:是Spring提供的平台事务管理器,包括几个方法:TransactionStatus getTransaction(TransactionDefination defination):获取事务状态信息void commit(TransactionStatus status):提交事务;void rollback(TransactionStatus status):回滚事务;
该接口有3个主要的实现类:
org.springframework.jdbc.datasource.DataSourceTransactionManager:用于配置JDBC数据源的事务管理器;
org.springframework.orm.hibernate.HibernateTransactionManager:用于配置Hibernate事务管理器;
org.springframework.transaction.jta.JtaTransactionManager:用于配置全局事务管理器
持久层(模型层)采用不同技术时,使用不同PlatformTransactionManager的实现类
2.TransactionDefination:定义事务规则,获取事务信息 包括几个方法:string getName():获取事务对象名称;int getIsolationLevel():获取事务隔离级别;int getPropagationBehavior():获取事务传播行为;int getTimeout():获取事务超时时间;boolean isReadOnly():获取事务是否只读;
3.TransactionStatus 描述事务某一时刻的状态 包括几个方法:void flush(): 刷新事务;boolean hasSavePoint():获取是否存在保存点;boolean idCompleted(): 获取事务是否完成;boolean isNewTransaction(): 获取是否为新事务;boolean isRollbackOnly(): 获取事务是否回滚;void setRollbackOnly() : 设置事务回滚;