上一篇:利用注解 + 反射消除重复代码,妙!

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

面试官:说说 Spring 事务设计原理?

你搞懂了么??

前言

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

在实际开发中,我们对事务应用最多就是在数据库操作这一环,特别是Spring对数据库事务进行了封装管理。

Spring对事务的支持,确实很强大,但是从本质上来讲:事务是否生效取决数据库底层是否支持(比如MySQL的MyISAM引擎就不支持事务,Spring能奈何!),同时一个事务的多个操作需要在同一个Connection上。事务也往往是在业务逻辑层来控制。

本篇博客将通过手写一个Demo来分析Spring事务底层到底是如何帮助我们轻松完成事务管理的!

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

先来看一眼工程结构:

ConnectionHolder

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

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

Spring很聪明,她提供了一种思路,来解决,看下面的代码!另外,Spring 系列面试题和答案全部整理好了,微信搜索互联网架构师,在后台发送:2T,可以在线阅读。

SingleThreadConnectionHolder

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

TransactionManager

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

UserAccountDao、UserOrderDao

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

UserService

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

Test

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

运行结果

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

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

感谢您的阅读,也欢迎您发表关于这篇文章的任何建议,关注我,技术不迷茫!小编到你上高速。

· END ·

最后,关注公众号互联网架构师,在后台回复:2T,可以获取我整理的 Java 系列面试题和答案,非常齐全。

正文结束

推荐阅读 ↓↓↓

1.不认命,从10年流水线工人,到谷歌上班的程序媛,一位湖南妹子的励志故事

2.如何才能成为优秀的架构师?

3.从零开始搭建创业公司后台技术栈

4.程序员一般可以从什么平台接私活?

5.37岁程序员被裁,120天没找到工作,无奈去小公司,结果懵了...

6.IntelliJ IDEA 2019.3 首个最新访问版本发布,新特性抢先看

7.这封“领导痛批95后下属”的邮件,句句扎心!

8.15张图看懂瞎忙和高效的区别!

面试官:说说 Spring 事务设计原理?面试必问!相关推荐

  1. 面试官: 讲讲 Spring 事务有哪些坑?

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 引言 今天,我们来讲 Spring 中和事务有关的考题. ...

  2. 面试官:Spring事务的传播行为有几种?

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:程序员入职国企,1周上班5小时,晒出薪资感叹:腾讯当CEO也不去个人原创+1博客:点击前往,查看更多 在Spri ...

  3. 面试官:Spring事务失效的场景有哪些?如何解决?

     作者:溪~源 blog.csdn.net/xuan_lu/article/details/107797505 实际项目开发中,如果涉及到多张表操作时,为了保证业务数据的一致性,大家一般都会采用事务机 ...

  4. 面试官:Spring 用了哪些设计模式?说三种即可 = =

    面试官:Spring 用了哪些设计模式?说三种即可 = = 转载:https://mp.weixin.qq.com/s/LGD54XaK4RmhZHxtU0BADg 转载理由:还可以

  5. 面试官:说一下HashMap原理,循环链表是如何产生的

    Map 这样的 Key Value 在软件开发中是非常经典的结构,常用于在内存中存放数据.众所周知 HashMap 底层是基于 数组 + 链表 组成的,不过在 JDK1.7 和 1.8 中具体实现稍有 ...

  6. 面试官:spring boot和spring究竟有啥区别?

    面试官:spring boot和spring究竟有啥区别? 前言 今天本篇文章主要聚焦说说,spring boot和spring究竟有啥区别,重点对比MVC模块以及Security模块在两大框架使用时 ...

  7. Spring合集篇|面试官:Spring都讲不明白,自己走还是我送你?

    spring合集|面试官:Spring都讲不明白,自己走还是我送你? 更多合集: B站主页 更多学习资料免费领取.

  8. 从面试官的角度谈谈大数据面试

    作者:大叔据 来源:大叔据 关于传授面试经验的文章太多了,眼花缭乱,我这里就不谈了,点进来想获取几吨面试学习资料的同学,抱歉让你失望了.(我是真的找不到那么多资料...).所以,今天我们只聊面试官. ...

  9. 从面试官角度看iOSer应该如何面试

    黑客技术 点击右侧关注,了解黑客的世界! Java开发进阶 点击右侧关注,掌握进阶之路! Python开发 点击右侧关注,探讨技术话题! 作者丨Maru 链接: https://www.jianshu ...

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

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

最新文章

  1. 说一说activity
  2. 【怎样写代码】偷窥高手 -- 反射技术(七):通过反射实例化对象
  3. oracle cpu分配,CPU 分配 - Oracle VM Server for SPARC 2.0 管理指南
  4. Python 的 time 模块导入及其方法
  5. MS SQL入门基础:删除数据
  6. Mybatis 实现SQL拦截并在控制台打印SQL和参数
  7. 正则去除包裹的大括号
  8. 年底跳槽,都去哪儿?数万从业者的新选择即将揭幕
  9. [胡思乱想]网络游戏与社会资源公平分配
  10. JQuery 制作消息弹出框、按钮点击音效
  11. Layui 的内置jquery 版本
  12. 号外:中国雅虎相册即将关闭原图下载 请网友及时备份
  13. 【FND】EBS中Java并发程序开发
  14. [bzoj3998]弦论
  15. Home Assistant 入门安装
  16. SAP WRITE设置列表颜色 页眉页尾输出控制
  17. 【DPABI教程】DPARSF详细教程笔记
  18. 朋友圈广告投放优势及广告投放案例分享
  19. 先调用finish() 然后startActivity有什么区别?
  20. php简单富文本,JavaScript_Javascript实现简单的富文本编辑器附演示,复制代码 代码如下: span styl - phpStudy...

热门文章

  1. Chrome浏览器Network面板http请求时间分析
  2. 《Linux》美轮美奂的Arch, 详解Arch虚拟机安装
  3. iOS开发-当APP涉及到用户敏感信息适配Xcode9及(ios11)
  4. Mysql——数据查询
  5. [Unity3D]Unity3D圣骑士当游戏开发商遭遇Mecanim动画系统
  6. 关于hive和spark日志问题
  7. Mysql 慢查询和慢查询日志分析
  8. Illustrator 教程,如何在 Ai 中创建一个新文档?
  9. Safari 搜寻引擎被 Yahoo 绑架,试试这 4 种解决方法
  10. iOS开发字符串倒序,倒序单词字母,不倒序单词位置