Spring中,名为spring-tx-4.3.6.RELEASE的jar包,是Spring用于事务管理的依赖包,使用前需要在pom.xml中添加到依赖标签<dependencies>中:
1.5 Spring框架 --基于AOP的声明式事务管理

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 属性也没有限制,所以是任意方法),都会触发事务管理

1.5 Spring框架 --基于AOP的声明式事务管理

最后,简单提一下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() : 设置事务回滚;

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-08-04
  • 2022-01-10
  • 2021-07-13
猜你喜欢
  • 2022-01-09
  • 2021-07-07
  • 2022-12-23
  • 2021-11-09
相关资源
相似解决方案