面试题: Spring中的事务是如何实现的?

Spring中的事务是如何实现的?

背景

个人原因的背景

想换工作, 刷面试题看到的问题, 简单记录一下, 算是个人学习的输出, 方便后续回顾, 也加深印象.

2024年11月14日09:32:49: 感觉我只看面试题, 完全看不进去. 通过不让自己手闲下来的方式, 促进一下我找工作的进程.

正规一点的背景

事务是确保数据的一致性和完整性. 还是很关键的. 面试也喜欢问.

答案

  1. Spring 事务底层是基于数据库事务和AOP机制实现的.
  2. 首先对于使用了@Transaction注解的Bean, Spring 会创建一个代理对象作为Bean
  3. 当调用代理对象的方法时, 会判断该方法上是否加了 @Transaction 注解
  4. 如果加了, 那么则利用事务管理器创建一个数据库连接
  5. 并且修改数据库连接的autocommit 属性为false, 禁止此事务自动提交, 这是Spring事务非常重要的一步.
  6. 然后执行当前方法, 方法中会执行SQL
  7. 执行完当前方法后, 如果没有出现一异常就直接提交事务.
  8. 如果出现了异常, 并且这个异常是需要回滚的, 就会回滚事务, 否则仍然提交事务.
  9. Spring事务的隔离级别对应的就是数据库的隔离级别
  10. Spring事务的传播机制就是Spring事务自己实现的, 也是Spring事务中最复杂的
  11. Spring事务的传播机制是基于数据库连接来做的, 一个数据库连接一个事务, 如果传播机制配置为需要新开一个事务, 那么实际上就是先创立一个数据库连接, 在此新数据库连接上执行SQL.

一些思绪和灵感

Q: 事务为了解决什么问题?

A: 如果程序中途出现的异常, 事务可以进行数据的回滚.

Q: 为什么事务很关键?

A: 事务的控制

Q: 分布式系统, 怎么做事务的管理?

A: 就是分布式事务. 系统A告诉系统B: 你需要回滚. 但是系统B: 我都一直处理完了, 怎么回滚?

Q: Spring事务的隔离级别, MySQL的事务隔离级别?

A: 应该有一个枚举, 就是和市面的数据库产品对应的吧.

Q: 程序中有哪几种事务的方式:

A: 我知道的有两种:

1.Spring注解的方式

2.编程式事务

个人理解程度

Spring的事务是通过@Transcation注解实现的, 其底层原理就是利用了AOP, 面向切面的技术.

autocommit 先关闭掉. 如果出现了需要回滚的异常, 就会执行回滚操作, 否则直接提交事务.

隔离级别和数据库的隔离级别保持一致.

传播机制, 是Spring自己去实现的, 我们一般都是用得默认的传播机制.

拓展知识

Spring的事务管理主要涉及哪几个类?

  1. PlatformTransactionManager:事务管理器,负责事务的创建、提交和回滚等操作。
  2. TransactionDefinition:事务定义,用于指定事务的属性,如隔离级别、传播行为等。
  3. TransactionStatus:事务状态,用于记录事务的生命周期状态,如是否已经提交或回滚等。
  4. TransactionProxyFactoryBean:代理工厂Bean,用于创建代理对象。
  5. MethodInterceptor:方法拦截器,用于在方法执行前后添加事务管理的逻辑。

在Spring中,事务管理的流程是怎样的?

  1. 当一个方法被标记为@Transactional时,Spring会创建一个代理对象来执行该方法。
  2. 代理对象会在方法执行前后添加事务管理的逻辑,包括事务的开始、提交或回滚等操作。
  3. 如果方法执行成功,则事务会被提交;如果方法执行失败,则事务会被回滚。
相关推荐
源代码•宸5 小时前
分布式缓存-GO(分布式算法之一致性哈希、缓存对外服务化)
开发语言·经验分享·分布式·后端·算法·缓存·golang
It's now5 小时前
Spring AI 基础开发流程
java·人工智能·后端·spring
cxh_陈5 小时前
线程的状态,以及和锁有什么关系
java·线程·线程的状态·线程和锁
计算机毕设VX:Fegn08955 小时前
计算机毕业设计|基于springboot + vue图书商城系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端·课程设计
R.lin5 小时前
Java 8日期时间API完全指南
java·开发语言·python
毕设源码-赖学姐5 小时前
【开题答辩全过程】以 高校教学质量监控平台为例,包含答辩的问题和答案
java·eclipse
高山上有一只小老虎5 小时前
翻之矩阵中的行
java·算法
火钳游侠6 小时前
java单行注释,多行注释,文档注释
java·开发语言
code bean6 小时前
【CMake】为什么需要清理 CMake 缓存文件?深入理解 CMake 生成器切换机制
java·spring·缓存
selt7916 小时前
Redisson之RedissonLock源码完全解析
android·java·javascript