关于java:面试官说说-Spring-事务设计原理面试必问

2次阅读

共计 1399 个字符,预计需要花费 4 分钟才能阅读完成。

作者:张丰哲 \
起源:www.jianshu.com/p/1becdc376f5d

前言

事务,是形容一组操作的形象,比方对数据库的一组操作,要么全副胜利,要么全副失败。事务具备 4 个个性:Atomicity(原子性),Consistency(一致性),Isolation(隔离性),Durability(持久性)。

在理论开发中,咱们对事务利用最多就是在数据库操作这一环,特地是 Spring 对数据库事务进行了封装治理。

Spring 对事务的反对,的确很弱小,然而从实质上来讲:事务是否失效取决数据库底层是否反对(比方 MySQL 的 MyISAM 引擎就不反对事务,Spring 能奈何!),同时一个事务的多个操作须要在同一个 Connection 上。事务也往往是在业务逻辑层来管制。

本篇博客将通过手写一个 Demo 来剖析 Spring 事务底层到底是如何帮忙咱们轻松实现事务管理的!

透彻了解 Spring 事务设计思维之手写实现

举荐一个 Spring Boot 基础教程及实战示例:
https://www.javastack.cn/cate…

先来看一眼工程构造:

ConnectionHolder

在 Spring 中,有时候咱们是不是要配置多个数据源 DataSource?很显然,Spring 须要通过 DataSource 来失去操作数据库的管道 Connection,这有点相似于 JNDI 查找。

这里通过 ConnectionHolder 类来实现这个过程,须要思考的是在多线程下,这显然是存在问题的。为防止多线程问题,难道咱们采纳线程平安的 Map,比方 ConcurrentHashMap,其实咱们真正的目标是什么?是保障一个线程下,一个事务的多个操作拿到的是一个 Connection,显然应用 ConcurrentHashMap 根本无法保障!

Spring 很聪慧,她提供了一种思路,来解决,看上面的代码!

SingleThreadConnectionHolder

原本线程不平安的,通过 ThreadLocal 这么封装一下,立即就变成了线程的局部变量,不仅仅平安了,还保障了一个线程上面的操作拿到的 Connection 是同一个对象!这种思维,的确十分奇妙,这也是无锁编程思维的一种形式!

TransactionManager

TransactionManager,这个咱们常常在 Spring 外面进行配置吧,事务大管家!另外,Spring 系列面试题和答案全副整顿好了,微信搜寻​Java 技术栈,在后盾发送:面试,​能够在线浏览。

UserAccountDao、UserOrderDao

这里通过这 2 个 DAO,想模仿一个事务中账户购买、下单 2 个操作。

UserService

到这里,能够清晰的看到 Spring 事务管理的一个缩影了吧!

Test

这里,次要是模仿 Spring 的注入以及多用户并发申请。

运行后果

你能够发现,一个线程中的一个事务的多个操作,应用的是同一个 Connection!

好了,到这里,你是否能对 Spring 实现事务的思维有所理解呢?

近期热文举荐:

1.1,000+ 道 Java 面试题及答案整顿 (2021 最新版)

2. 别在再满屏的 if/ else 了,试试策略模式,真香!!

3. 卧槽!Java 中的 xx ≠ null 是什么新语法?

4.Spring Boot 2.5 重磅公布,光明模式太炸了!

5.《Java 开发手册(嵩山版)》最新公布,速速下载!

感觉不错,别忘了顺手点赞 + 转发哦!

正文完
 0