作者:张丰哲 \
起源: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开发手册(嵩山版)》最新公布,速速下载!

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