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

面试官:说说Spring事务的设计原理?面试必问!

时间:2023-04-01 17:58:22 Java

作者:张丰哲\来源:www.jianshu.com/p/1becdc376f5d前言事务是一种抽象,描述了一组操作,比如对数据库的一组操作,要么全部成功,要么全部失败。事务有四个特性:Atomicity(原子性)、Consistency(一致性)、Isolation(隔离)、Durability(持久性)。在实际开发中,我们的事务应用大部分都是在数据库操作环节,尤其是Spring对数据库事务进行了封装和管理。Spring对事务的支持确实很强大,但本质上:一个事务是否生效取决于底层数据库是否支持(比如MySQL的MyISAM引擎不支持事务,Spring能干嘛!),一个事务的多个操作交易需要在同一个连接上进行。事务也经常在业务逻辑层进行控制。本篇博客将通过写一个Demo来分析Spring事务底层是如何帮助我们轻松完成事务管理的!吃透Spring事务设计思想的手写实现推荐一个SpringBoot基础教程和实例:https://www.javastack.cn/cate...先来看看项目结构:ConnectionHolder在Spring,有时候我们不是想配置多个数据源DataSource?很明显,Spring需要通过DataSource获取管道Connection来操作数据库,有点类似于JNDIlookup。这里使用ConnectionHolder类来完成这个过程。需要考虑的是,在多线程下,这显然是一个问题。为了避免多线程问题,我们是否使用线程安全的Map,比如ConcurrentHashMap,我们的真正目的是什么?保证在一个线程下,一个事务的多个操作都会得到一个Connection。显然,使用ConcurrentHashMap根本不能保证!spring很聪明,她提供了解决的思路,看下面的代码!SingleThreadConnectionHolder不是线程安全的,但是被ThreadLocal封装了,立马变成了线程的局部变量,不仅安全,而且保证了一个线程下操作得到的Connection是同一个对象!这种思路确实很巧妙,也是无锁编程的一种思路!TransactionManagerTransactionManager,我们在Spring中经常配置这个,大业务管家!另外,Spring系列面试题及答案已经全部整理完毕。微信搜索Java技术栈,后台发:面试,可以在线阅读。这里的UserAccountDao和UserOrderDao就是用这两个DAO来模拟交易中的账户购买和下单这两个操作。这里的UserService,可以清晰的看到Spring事务管理的一个缩影!这里测试主要是模拟Spring注入和多用户并发请求。从运行结果可以发现,一个线程中一个事务的多个操作使用的是同一个Connection!好了,说到这里,是不是对Spring实现事务的思路有了一些了解呢?近期热点文章推荐:1.1,000+Java面试题及答案(2021最新版)2.别在满屏的if/else中,试试策略模式,真的很好吃!!3.操!Java中xx≠null的新语法是什么?4、SpringBoot2.5发布,深色模式太炸了!5.《Java开发手册(嵩山版)》最新发布,赶快下载吧!感觉不错,别忘了点赞+转发!