作者:张丰哲 \
起源: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 开发手册(嵩山版)》最新公布,速速下载!
感觉不错,别忘了顺手点赞 + 转发哦!