2019独角兽企业重金招聘Python工程师标准>>>

前言

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

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

先来看一眼工程结构:

工程结构

ConnectionHolder

ConnectionHolder

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

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

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

SingleThreadConnectionHolder

SingleThreadConnectionHolder

本来线程不安全的,通过ThreadLocal这么封装一下,立刻就变成了线程的局部变量,不仅仅安全了,还保证了一个线程下面的操作拿到的Connection是同一个对象!这种思想,确实非常巧妙,这也是无锁编程思想的一种方式!

TransactionManager

TransactionManager

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

UserAccountDao、UserOrderDao

UserAccountDao

UserOrderDao

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

UserService

UserService

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

Test

测试

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

运行结果

运行结果

你可以发现,一个线程中的一个事务的多个操作,使用的是同一个Connection!

转载于:https://my.oschina.net/u/3906190/blog/2002738

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

  1. 【手写系列】透彻理解Spring事务设计思想之手写实现

    事务,是描述一组操作的抽象,比如对数据库的一组操作,要么全部成功,要么全部失败.事务具有4个特性:Atomicity(原子性),Consistency(一致性),Isolation(隔离性),Dura ...

  2. 【手写系列】透彻理解MyBatis设计思想之手写实现

    前言 MyBatis,曾经给我的感觉是一个很神奇的东西,我们只需要按照规范写好XXXMapper.xml以及XXXMapper.java接口.要知道我们并没有提供XXXMapper.java的实现类, ...

  3. 深入理解 Spring Boot Starters 原理(手写Spring boot Start)

    一.Spring Boot Starter诞生原因 Spring Boot Starter是在SpringBoot组件中被提出来的一种概念,stackoverflow上面已经有人概括了这个starte ...

  4. 【手写系列】理解数据库连接池底层原理之手写实现

    前言 数据库连接池的基本思想是:为数据库连接建立一个"缓冲池",预先在池中放入一定数量的数据库连接管道,需要时,从池子中取出管道进行使用,操作完毕后,再将管道放入池子中,从而避免了 ...

  5. 不同类的方法 事务问题_深入理解 Spring 事务原理

    Spring事务的基本原理 Spring事务的本质其实就是数据库对事务的支持,没有数据库的事务支持,spring是无法提供事务功能的.对于纯JDBC操作数据库,想要用到事务,可以按照以下步骤进行: 获 ...

  6. @transactional注解原理_《Spring源码解析(十二)》深入理解Spring事务原理,告别面试一问三不知的尴尬...

    本文将带领大家领略Spring事务的风采,Spring事务是我们在日常开发中经常会遇到的,也是各种大小面试中的高频题,希望通过本文,能让大家对Spring事务有个深入的了解,无论开发还是面试,都不会让 ...

  7. 细读《深入理解 Android 内核设计思想》(四)Binder 机制 [中]

    对冗余挑拣重点,对重点深入补充,输出结构清晰的精简版 智能指针 binder 驱动中的结构体 ProcessState IPCThreadState BpBinder BinderProxy Serv ...

  8. 深入理解Spring事务原理【为何有了数据库事务还要使用Spring事务】

    一.事务的基本原理 Spring事务 的本质其实就是数据库对事务的支持,没有数据库的事务支持,spring是无法提供事务功能的.对于纯JDBC操作数据库,想要用到事务,可以按照以下步骤进行:     ...

  9. 一文带你深入理解 Spring 事务原理

    点击上方 "程序员小乐"关注, 星标或置顶一起成长 后台回复"大礼包"有惊喜礼包! 关注订阅号「程序员小乐」,收看更多精彩内容 每日英文 Man has to ...

最新文章

  1. python网上授课_python完整课程
  2. windows安装anaconda_[计算机科学工具系列] Anaconda和conda
  3. Redis-学习笔记03【Redis持久化】
  4. windows server 2008 + IIS 7.5实现多用户FTP(多账号对应不同目录)
  5. 线程池及并发编程基础总结
  6. 壕无人性!618战报发布:天猫、京东累计下单金额近万亿
  7. python钉钉扫码登录程序_使用python+django集成钉钉三方扫码登陆
  8. Android开发指南(41) —— Searchable Configuration
  9. 用python提取图片主要颜色_用Python提取图片主要颜色
  10. 情态 语态_情绪与情态与对话情感
  11. 如何Vue项目中加载字体的最佳做法
  12. 写作的感悟:低头走路与抬头看天
  13. 关闭eslint语法检查
  14. 【DBeaver】安装与使用教程
  15. 湖南大学计算机学硕经验分享,2021湖南大学计算机专硕备考经验分享
  16. 微信群超好用的红包抽奖小程序
  17. naticat连接mysql报错_「2509」Navicat连接mysql报错2509 - seo实验室
  18. 习题 4.15 用条件编译方法实现以下功能:输入一行电报文字,可以任选两种输出,一为原文输出;一为将字母变成其下一字母。用#define命令来控制是否要译成密码。
  19. 身份证验证信息15位或18位
  20. vim编辑器中cscope自动加载cscope.out文件的方法

热门文章

  1. DRDB的安装配置与使用(第二版)
  2. Debian读写ntfs分区格式!
  3. python进阶:闭包、map/reduce/filter函数、lambda函数、装饰器
  4. Java内存数据库-H2介绍及实例(SpringBoot)
  5. Toad DBA Suite for Oracle 12.6 64-bit Commercial 简单连接
  6. dfs-Rank the Languages
  7. 【加】德鲁·卡宾森 - 质量效应3:天罚(2013年6月26日)
  8. ant安装过程,配置过程
  9. openjdk需要自己添加cacerts,
  10. 中间层通讯 Socket? Remoting? WCF?