透彻理解Spring事务设计思想之手写实现

前言

事务,是描述一组操做的抽象,好比对数据库的一组操做,要么所有成功,要么所有失败。事务具备4个特性:Atomicity(原子性),Consistency(一致性),Isolation(隔离性),Durability(持久性)。在实际开发中,咱们对事务应用最多就是在数据库操做这一环,特别是Spring对数据库事务进行了封装管理。Spring对事务的支持,确实很强大,可是从本质上来说:事务是否生效取决数据库底层是否支持(好比MySQL的MyISAM引擎就不支持事务,Spring能奈何!),同时一个事务的多个操做须要在同一个Connection上。事务也每每是在业务逻辑层来控制。本篇博客将经过手写一个Demo来分析Spring事务底层究竟是如何帮助咱们轻松完成事务管理的!数据库

透彻理解Spring事务设计思想之手写实现

先来看一眼工程结构:编程

透彻理解Spring事务设计思想之手写实现

ConnectionHolder

透彻理解Spring事务设计思想之手写实现

在Spring中,有时候咱们是否是要配置多个数据源DataSource?很显然,Spring须要经过DataSource来获得操做数据库的管道Connection,这有点相似于JNDI查找。安全

这里经过ConnectionHolder类来完成这个过程,须要思考的是在多线程下,这显然是存在问题的。为避免多线程问题,难道咱们采用线程安全的Map,好比ConcurrentHashMap,其实咱们真正的目的是什么?是保证一个线程下,一个事务的多个操做拿到的是一个Connection,显然使用ConcurrentHashMap根本没法保证!多线程

Spring很聪明,她提供了一种思路,来解决,看下面的代码!并发

SingleThreadConnectionHolder

透彻理解Spring事务设计思想之手写实现

原本线程不安全的,经过ThreadLocal这么封装一下,马上就变成了线程的局部变量,不单单安全了,还保证了一个线程下面的操做拿到的Connection是同一个对象!这种思想,确实很是巧妙,这也是无锁编程思想的一种方式!ide

TransactionManager

透彻理解Spring事务设计思想之手写实现

TransactionManager,这个咱们常常在Spring里面进行配置吧,事务大管家!线程

UserAccountDao、UserOrderDao

透彻理解Spring事务设计思想之手写实现

透彻理解Spring事务设计思想之手写实现

这里经过这2个DAO,想模拟一个事务中帐户购买、下单2个操做。设计

UserService

透彻理解Spring事务设计思想之手写实现

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

Test

透彻理解Spring事务设计思想之手写实现

这里,主要是模拟Spring的注入以及多用户并发请求。对象

运行结果

透彻理解Spring事务设计思想之手写实现

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

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

相关文章
相关标签/搜索