当前位置: 首页 > 后端技术 > Java

Spring事务简介

时间:2023-04-01 21:55:10 Java

事务有四个主要特性:原子性、一致性、隔离性和持久性。对于Spring事务,最终是在数据库层面实现的,Spring只是将其封装得更加优雅而已。spring常用的事务管理方式有aspectj和annotation-based。使用aspectj在xml配置文件中指定事务的传播级别、隔离级别、入口点(需要增强的方法)、切面等。配置繁琐,项目无法与框架耦合;基于注解,只需要在事务管理方法上使用@Transactional,然后在xml文件中标记即可启动事务。当然,两个交易的入口都是通过来实现的。下面是@Transactional注解的使用方法:tx:annotation-driven是Spring事务的驱动。Spring会在TxNamespaceHandler中注册对应的解析器,然后在AnnotationDrivenBeanDefinitionParser中处理注解驱动。处理完之后,会得到一个名为BeanFactoryTransactionAttributeSourceAdvisor类型的bean,会在BeanFactory中注册这个bean,其实是一个Advisor类型,这也是Spring事务可以通过Aop实现事务的根本原因。Aop在解析的时候,最终会生成一个Adivsor对象,这个对象封装了切面编织所需要的所有信息,包括最重要的两个部分,Pointcut和Adivce属性。这里Pointcut用于判断目标bean是否需要织入当前切面逻辑;Advice封装了需要编织的切面逻辑。下面是这三部分的简单关系图:对于Spring事务,由于是使用SpringAop实现的,所以也会有这三个成员。Advisor对应BeanFactoryTransactionAttributeSourceAdvisor类,Advice对应TransactionInterceptor类,Pointcut对应TransactionAttributeSourcePointcut类,这三个类之间的关系如下:这三个类的作用是:BeanFactoryTransactionAttributeSourceAdvisor:封装了实现事务所需的所有属性,包括Pointcut、Advice、TransactionManager以及Transactional注解中声明的其他一些属性;TransactionAttributeSourcePointcut:用于确定哪些bean需要被编织到当前事务逻辑中。这里可以想象,其判断的基本逻辑是判断其方法或类声明上是否使用了@Transactional注解。如果使用,就是一个bean,需要编织到事务逻辑中;TransactionInterceptor:这个bean本质上是一个Advice,它封装了当前需要编织到目标bean中的切面逻辑,即如果Spring事务使用数据库事务来实现目标方法的周边。最后spring提交事务的方法是:org.springframework.transaction.support.AbstractPlatformTransactionManager#processCommit提交时有很多选择,包括jdbc(其他还有JMS、Hibernate、JPA等)。最后,SpringAOP使用了两种代理机制,一种是基于JDK的动态代理(默认),一种是基于CGLib的动态代理。spring事务超时不起作用的原因事务不回滚的场景参考文章:Spring事务使用示例及实现原理Spring事务相关文章