Java面试八股之什么是声明式事务管理,spring怎么实现声明式事务管理?

devtools/2024/9/22 16:46:03/
  1. 什么是声明式事务管理,spring怎么实现声明式事务管理?

声明式事务管理是一种编程范式,它允许开发人员通过声明性的配置或注解,而不是硬编码事务处理逻辑,来指定哪些方法或类应该在其上下文中执行事务。这种方法将事务管理的职责从业务代码中分离出来,简化了开发工作,增强了代码的可读性和可维护性。

在Spring框架中,声明式事务管理是基于AOP(面向切面编程)机制实现的。具体过程如下:

1. 使用事务注解:

Spring支持在类或方法上使用特定的事务注解来声明事务边界。常见的注解包括:

@Transactional: 应用于类或方法上,表示该类的所有公共方法或特定方法应在一个事务上下文中执行。

参数:@Transactional注解可以接受多个参数来定制事务行为,如隔离级别、传播行为、回滚规则、超时设定等。

在这个例子中,UserService类被标注为@Transactional,这意味着其所有公共方法(如createUser)将在一个事务中执行。如果userRepository.save(user)抛出异常,整个事务将会自动回滚。

2. 配置事务管理器:

Spring需要一个事务管理器来实际执行事务的开启、提交、回滚等操作。通常会配置一个与持久化技术(如JDBC、JPA、Hibernate等)相匹配的事务管理器。例如,对于JDBC,可以配置DataSourceTransactionManager;对于JPA,可以配置JpaTransactionManager。

或者使用Java配置

3. 启用事务注解驱动:

要让Spring识别并处理@Transactional注解,需要在配置中启用事务注解驱动。在XML配置中,可以通过 <tx:annotation-driven> 标签实现;在Java配置中,通过 @EnableTransactionManagement 注解启用。

或者使用Java配置

4. AOP代理与拦截:

当Spring容器启动时,它会扫描带有@Transactional注解的类和方法,并通过AOP代理机制为这些方法创建代理对象。当客户端代码调用这些方法时,实际上是通过代理对象进行调用。代理对象在方法调用前后插入事务管理逻辑:

方法开始前:检查是否有现有事务正在运行,如果没有,则根据@Transactional的配置新建一个事务。

方法执行过程中:监控方法执行,如果发生未被捕获的异常,根据回滚规则(默认情况下,运行时异常和Error会导致回滚)决定是否回滚事务。

方法结束后:如果方法正常返回或抛出的异常不在回滚规则之内,提交事务;否则,回滚事务。

通过以上步骤,Spring实现了声明式事务管理。开发人员只需要在业务代码中使用@Transactional注解进行简单的声明,Spring框架会在幕后自动处理事务的生命周期,大大简化了事务管理的复杂性。

  如果大家需要视频版本的讲解,欢迎关注我的B站:


http://www.ppmy.cn/devtools/84855.html

相关文章

Vue学习---vue 防抖处理函数,是处理什么场景

Vue防抖处理函数是用来处理在快速连续操作中&#xff0c;只执行最后一次操作的情况。 例如&#xff0c;在输入框输入时&#xff0c;我们可能希望只在用户完成输入后进行处理&#xff0c;而不是在每次键入时都处理。(n秒后触发一次) 以下是一个简单的Vue防抖处理函数的例子&am…

LeetCode206 反转链表

前言 题目&#xff1a; 206. 反转链表 文档&#xff1a; 代码随想录——反转链表 编程语言&#xff1a; C 解题状态&#xff1a; 有了思路以后没敢尝试 思路 需要注意的是创建指针不会申请额外的内存空间。 代码 方法一&#xff1a; 双指针法/迭代 我的理解是创建了三个指针…

深入理解二叉搜索树:定义、操作及平衡二叉树

引言 二叉搜索树&#xff08;Binary Search Tree&#xff0c;BST&#xff09;是一种特殊的二叉树结构&#xff0c;每个节点的左子树节点值小于根节点值&#xff0c;而右子树节点值大于根节点值。二叉搜索树在计算机科学中有着广泛的应用&#xff0c;尤其在动态查找表和优先队列…

关于iphone不能下载三方软件

iPhone 不能下载第三方软件的原因主要是因为苹果公司严格控制其应用生态系统&#xff0c;确保所有应用都通过其官方的 App Store 分发。这有几个主要原因&#xff1a; 安全性&#xff1a;苹果公司希望通过这种方式减少恶意软件的传播&#xff0c;保护用户的隐私和数据安全。所…

使用集成线性 LED 驱动器替代分立 LED 电路设计

在转向灯、刹车灯和尾灯等汽车照明中&#xff0c;LED 电路设计通常采用分立元件&#xff0c;如双极结晶体管 (BJT)。分立元件之所以突出有几个常见原因&#xff1a;它们简单、可靠且便宜。然而&#xff0c;随着 LED 数量和项目要求的增加&#xff0c;重新考虑离散设计可能是值得…

vue 一个数组 获取最大值与最小值

<template><div>最小值: {{ minValue }}最大值: {{ maxValue }}</div> </template><script> export default {data() {return {numbers: [10, 2, 33, 4, 55, 6]};},computed: {minValue() {return Math.min(...this.numbers);},maxValue() {retu…

前端面试 vue 按钮级的权限控制

方案一 按钮权限也可以用v-if判断 但是如果页面过多&#xff0c;每个页面页面都要获取用户权限role和路由表里的meta.btnPermissions&#xff0c;然后再做判断 这种方式就不展开举例了 方案二 使用自定义指令实现 按钮级的权限控制 思维导图 心就是自定义指令的书写 首先…

LiRouter V3.0无人机自主精细化巡检 LiStation V3.0输电线路巡检数障处理分系统 软件下载License使用

PeacePower LiRouter 输电线路无人机自主巡检航线规划系统&#xff08;本文档中简称 “LiRouter”&#xff09;&#xff0c;是基于高精度三维点云数据&#xff0c;在少量人工干预下为输电线路无人 机自主精细化巡检自动生成并输出航线的专业软件工具。 凭借在输电线路无人机智能…