文章插图
一、前言在现代软件开发中 , 事务处理是必不可少的一部分 。当多个操作需要作为一个整体来执行时 , 事务可以确保数据的完整性和一致性 , 并避免出现异常和错误情况 。在SpringBoot框架中 , 我们可以使用声明式事务和编程式事务来管理事务处理 。其中事务的坑也是不少 , 比较常见的就是事务失效 , 大家可以看看!后面小编在出一篇事务失效场景哈 , 喜欢的可以关注 , 等待更新哈!
这篇博客将重点探讨这两种事务处理方式的源码实现、区别、优缺点、适用场景以及实战 。我们来接着说事务 , 里面还涉及到三个知识点 , 大家可以自行百度好好了解!
- 事务的特性
- 事务的传播行为
- 隔离级别
让我们开始探索声明式事务和编程式事务吧!
文章很长 , 耐心看完希望对你有帮助!
本文源码是使用:springboot2.7.1 。
二、开启使用和大致源码实现1、开启使用我们在启动类上添加注解:@EnableTransactionManagement 。
后续使用就可以添加注解@Transactional(rollbackFor = Exception.class)使用 , 或者是使用编程式事务使用了 !
后面我们在详细演示怎么使用哈!
2、声明式事务源码
public class TransactionInterceptor extends TransactionAspectSupportimplements MethodInterceptor, Serializable{}
TransactionInterceptor UML图:文章插图
声明式事务主要是通过AOP实现 , 主要包括以下几个节点:
- 启动时扫描@Transactional注解:在启动时 , Spring Boot会扫描所有使用了@Transactional注解的方法 , 并将其封装成TransactionAnnotationParser对象 。
- AOP 来实现事务管理的核心类依然是 TransactionInterceptor 。TransactionInterceptor 是一个拦截器 , 用于拦截使用了 @Transactional 注解的方法
- 将TransactionInterceptor织入到目标方法中:在AOP编程中 , 使用AspectJ编写切面类 , 通过@Around注解将TransactionInterceptor织入到目标方法中 。
- 在目标方法执行前创建事务:在目标方法执行前 , TransactionInterceptor会调用PlatformTransactionManager创建一个新的事务 , 并将其纳入到当前线程的事务上下文中 。
- 执行目标方法:在目标方法执行时 , 如果发生异常 , 则将事务状态标记为ROLLBACK_ONLY;否则 , 将事务状态标记为COMMIT 。
- 提交或回滚事务:在目标方法执行完成后 , TransactionInterceptor会根据事务状态(COMMIT或ROLLBACK_ONLY)来决定是否提交或回滚事务 。
@Override@Nullablepublic Object invoke(MethodInvocation invocation) throws Throwable {// Work out the target class: may be {@code null}.// The TransactionAttributeSource should be passed the target class// as well as the method, which may be from an interface.Class<?> targetClass = (invocation.getThis() != null ? AopUtils.getTargetClass(invocation.getThis()) : null);// Adapt to TransactionAspectSupport's invokeWithinTransaction...return invokeWithinTransaction(invocation.getMethod(), targetClass, new CoroutinesInvocationCallback() {@Override@Nullablepublic Object proceedWithInvocation() throws Throwable {return invocation.proceed();}@Overridepublic Object getTarget() {return invocation.getThis();}@Overridepublic Object[] getArguments() {return invocation.getArguments();}});}
下面是核心处理方法 , 把不太重要的代码忽略了 , 留下每一步的节点 。@Nullableprotected Object invokeWithinTransaction(Method method, @Nullable Class<?> targetClass,final InvocationCallback invocation) throws Throwable {// 获取事务属性final TransactionManager tm = determ.NETransactionManager(txAttr);// 准备事务TransactionInfo txInfo = prepareTransactionInfo(ptm, txAttr, joinpointIdentification, status);// 执行目标方法Object retVal = invocation.proceedWithInvocation();// 回滚事务completeTransactionAfterThrowing(txInfo, ex);// 提交事务commitTransactionAfterReturning(txInfo);}
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 如何处理生产环境中的数据和机器学习偏误?
- 葡萄酒中的营养成分
- 乾隆通宝|乾隆通宝中的山底隆和正字隆哪个更具有收藏价值
- |如何正确对待职场中的“人情味”
- 钱币|第三版中的车工目前市场行情如何
- 袁大头|三年袁大头中的燕子版,如何辨别?
- 张颂文|娱乐圈中的世态炎凉,在46岁张颂文身上体现得很彻底
- 官窑|明清官窑中的“孔雀蓝釉”,罕见至极,不收藏可惜了!
- 新能源|论电视剧《对手》中的职场竞争与人性探究
- 陈道明|一个生日,娱乐圈中的世态炎凉,在69岁陈道明身上体现得淋漓尽致