Spring中的事务是如何实现的?
背景
个人原因的背景
想换工作, 刷面试题看到的问题, 简单记录一下, 算是个人学习的输出, 方便后续回顾, 也加深印象.
2024年11月14日09:32:49: 感觉我只看面试题, 完全看不进去. 通过不让自己手闲下来的方式, 促进一下我找工作的进程.
正规一点的背景
事务是确保数据的一致性和完整性. 还是很关键的. 面试也喜欢问.
答案
- Spring 事务底层是基于数据库事务和AOP机制实现的.
- 首先对于使用了@Transaction注解的Bean, Spring 会创建一个代理对象作为Bean
- 当调用代理对象的方法时, 会判断该方法上是否加了 @Transaction 注解
- 如果加了, 那么则利用事务管理器创建一个数据库连接
- 并且修改数据库连接的autocommit 属性为false, 禁止此事务自动提交, 这是Spring事务非常重要的一步.
- 然后执行当前方法, 方法中会执行SQL
- 执行完当前方法后, 如果没有出现一异常就直接提交事务.
- 如果出现了异常, 并且这个异常是需要回滚的, 就会回滚事务, 否则仍然提交事务.
- Spring事务的隔离级别对应的就是数据库的隔离级别
- Spring事务的传播机制就是Spring事务自己实现的, 也是Spring事务中最复杂的
- 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的事务管理主要涉及哪几个类?
- PlatformTransactionManager:事务管理器,负责事务的创建、提交和回滚等操作。
- TransactionDefinition:事务定义,用于指定事务的属性,如隔离级别、传播行为等。
- TransactionStatus:事务状态,用于记录事务的生命周期状态,如是否已经提交或回滚等。
- TransactionProxyFactoryBean:代理工厂Bean,用于创建代理对象。
- MethodInterceptor:方法拦截器,用于在方法执行前后添加事务管理的逻辑。
在Spring中,事务管理的流程是怎样的?
- 当一个方法被标记为@Transactional时,Spring会创建一个代理对象来执行该方法。
- 代理对象会在方法执行前后添加事务管理的逻辑,包括事务的开始、提交或回滚等操作。
- 如果方法执行成功,则事务会被提交;如果方法执行失败,则事务会被回滚。