梦中惊醒

在Tomcat的线程池里,有这样一个线程,自打出生后,从来不去干活儿,有好多次走出线程池“这座大山”去看世界的机会,都被他拱手让给了弟兄们。

弟兄们给他取了个名字叫二师兄。没错,好吃懒做,饱了睡,醒了吃。这不,又迷迷糊糊睡着了,还打呼噜呢。

“快起来,起来,干活去了”,有人在喊他。只见二师兄转转身,不耐烦道,“叫别人去,叫别人去”。

“哪还有别人呢”,突然声音高了八度。二师兄觉得不对劲儿啊,转身一看,原来是大管家亲自来了,吓得他赶紧跳起来向外跑去。

远方来客

二师兄来到大门外,看到一众人马已在此等候,他哪见过这场面啊,心里不免有些忐忑,强装镇定道,“你们领头儿的是谁,出来自我介绍下吧”。

眼见三个人下了马走上前来,第一位说道,“我是来自Spring家族的,叫Controller”。第二位说道,“我也是来自Spring家族,叫Service”。

“我是来自MyBatis家族,叫Mapper”,第三位说道,“我们结拜为异姓三兄弟,奉主人之命,前来执行任务”。

二师兄虽然没“见过世面”,但是在睡不着时总听弟兄们说起这些,嗯,是他们,准没错。“诸位都请下马随我来吧”。

大伙都跟着二师兄来到了Tomcat的大宅子的后院的西厢房的二堂里。二师兄招呼大家坐下,给他们端茶倒水,让诸位稍作休息。

老大来到二师兄面前道,“我们此行的目的是要到数据库山村进行交流学习,还请你做我们的向导,带领大伙一同前往”。

二师兄自然没去过数据库山村,但听说那里地处深山老林,一路崎岖陡峭,便不想带他们去。于是就准备吓唬吓唬他们,让他们自己打退堂鼓。

“数据库山村着实遥远,要翻过几座大山,走上几天几夜,关键一到夜里有豺狼虎豹出没,还听说绣花鞋都成精了,出来吃人啊”,二师兄道。

“不入虎穴,焉得虎子。我们兄弟既然来了,就不怕这些”,老二说道。“二哥说的对,我们不怕。来一个杀一个,来两个杀一双”,老三补充道。

二师兄一看这阵势,不去是不行了,就借故先出来了,去寻求帮助啊。

新式武器

一会儿功夫,只见二师兄咧着嘴、带着标志的憨笑向这边跑来,一边喊着,“三位哥哥,新式武器,新式武器,我们有救了,有救了”。

三兄弟一脸问号、有点莫名。老大道,“十八般兵器我们都带了,莫非你说的是第十九种”?“快拿出来,让我们见识见识”,老三接着道。

二师兄道,“这新式武器啊,它不是个兵器,是一种工具。其实事情原本是这样的。。。”。三兄弟听完二师兄的解说后明白了。

原来是Tomcat王府为了加强与周边的联系,就趁着前几天315的活动,在“五环外”的PDD上购买了“乡村版”的无绳电话,正好数据库山村也购买了,前几天已经收到货,调试好可以使用了。

“你们这次正好赶巧了,可以试试这个无绳电话,通过电话交流,不用再跑一趟了”,二师兄道。三兄弟只是听说过,但从没用过,有点迫不及待的想见见这“高科技”。

二师兄随即带领着大伙朝“机房”方向走去。

有点意思

大伙来到机房,看着无绳电话都很兴奋,但是没人会用,都望着二师兄。二师兄哪会用呢,只好翻箱倒柜找出了说明书,可惜自己看不懂。

老二对着自己的管家说道,“你来负责,找一些能工巧匠,好好研究研究说明书,把这电话搞定”。管家找出了平时爱捣鼓的那些队友,把说明书给了他们。

果然,片刻功夫,有个队友表示大概明白了,可以尝试一把。于是二师兄就给了他数据库山村的“联系方式”,他接着一顿操作猛如虎,把大伙整的一愣一愣的。

还别说,竟然通了,按照说明书上讲的,这就相当于建立了一条和数据库山村的“连接”,然后还要把这个连接设置成“不可自动挂断”,OK,搞定了。就把这个队友称为“接线员”吧。

接线员把电话交给了管家,管家心想这毕竟是Tomcat府上的东西,自己不能喧宾夺主,于是就把电话给了二师兄。二师兄道,“好,承蒙诸位看得起在下,那我就宣布本次交流开始”。又把电话给了管家。

领导先讲话这是自古以来的规矩,管家确认电话畅通后,就交给了自己的领导。于是老二Service通过老三Mapper,使用这个电话,终于和数据库山村“村长”MySql通上话了,一番寒暄过后,终于可以一对一的交流了。

队友1从管家处领取电话,坐到桌子前,打开本子,拿起电话,一面和对方沟通,一面记录一些东西。一段时间以后,他和对方互相道谢,结束了交流。

队友2从管家处领取电话,和对方进行了交流。接着队友3从管家处领取电话,又进行了长时间的交流。管家一看,电话快没电了,就把电话交给了自己的领导。

老二Service和村长MySql又是一番“互相吹捧”,最后约定改日再聊。然后就把电话又给了管家,管家确认没有人再使用了,于是就挂断了电话。

眼见天色已晚,二师兄安顿好大家,把电话拿去充电后,自己也去休息了。

意外收获

第二天一大早,老二让管家负责好今天的交流,自己就去找二师兄了。在管家的指导下,交流有条不紊的进行着。

半上午的时候,老二匆匆忙忙的回来了,拿出一个纸条,上面写着数据库山村的另一个电话号码,让管家帮他拨通这个号码。

管家一看,队友正在用电话交流着呢,但是领导的事情又不能违抗,让队友挂断电话放弃交流也不太合适啊。突然脑中一道灵光闪过。

记得昨天研究说明书时,看到过呼叫保持这种技术,就是让当前通话保持住,然后再开启一个全新的通话,等新的通话结束后,原来保持住的通话可以恢复。

管家让接线员进行处理,一番操作后成功了,只不过为啥是个女人的声音,哦,管家意识到这可能是个“私人”电话,于是识趣的和大家一起“慢慢地”向门外走去。

看样子自己的领导和那个女的很熟悉。这会是谁呢?管家一时也整不明白。一番脑细胞碰撞后,仿佛有了一点眉目,那应该是领导的一个笔友,平时都是书信来往。

管家总是去帮忙寄信和收信,既然是数据库山村的人,那平时都应该交流的是SQL优化啥的相关话题吧。当然,这是猜的,因为私拆领导信件犯法。

好长时间之后,领导终于完事了,把电话交给了管家。管家挂断了和这个女人的通话,并把之前保持住的那个通话进行了恢复,然后让队友继续之前的学术交流。

领导心里美滋滋的,我猜他一定在想什么时候还有活动啊,也去买个无绳电话。这样可以多和笔友进行“学术交流”了。


演员谢幕

异姓三兄弟都是我们的老朋友,再熟悉不过了。二师兄呢是一个线程,说明Spring事务的执行是和当前线程相关联的。

老二Service的管家其实就是事务管理器,负责事务的整体工作。接线员可以认为是DataSource,负责和数据库建立一条连接(Connection)。

把电话设置为不可自动挂断,表示的是把数据库连接设置为不自动提交事务,需要注意的是,这个设置是由事务管理器来操作的,而不是接线员。

开头的领导讲话,接下来的队友1/2/3的学术交流,还有最后的领导吹捧,其实是4个标有@Transactional注解的方法。且在第1个方法里调用了其它3个方法。

他们用的都是同一通电话在交流,说明4个方法的执行用的是同一个和数据库的连接,即一根绳子上的蚂蚱。最后管家挂断电话,表明是事务管理器提交了事务。

在第二天时,把当前通话进行呼叫保持,即对应于把当前线程上正在运行的事务挂起。拨通领导的私人电话,对应于当前线程新建一条到数据库的连接,即一个全新的事务。

管家挂断了领导的私人通话,即提交了这个新事务。然后恢复之前被保持的那个通话,即恢复之前那个被挂起的事务,使它重新成为当前线程正在运行的事务。

最后,领导没有买无绳电话,而是直接买了智能手机,并下载了微信。哈哈,你懂的。

PS:本文只是宏观描述,实际的事务代码执行比这要复杂一些。

(END)

作者是工作超过10年的码农,现在任架构师。喜欢研究技术,崇尚简单快乐。追求以通俗易懂的语言解说技术,希望所有的读者都能看懂并记住。下面是公众号和知识星球的二维码,欢迎关注!

       

睡梦中被拉起来执行Spring事务的更多相关文章

  1. spring 事务传播特性 和隔离级别

    事务的几种传播特性1. PROPAGATION_REQUIRED: 如果存在一个事务,则支持当前事务.如果没有事务则开启2. PROPAGATION_SUPPORTS: 如果存在一个事务,支持当前事务 ...

  2. Spring事务管理(转)

    1 初步理解 理解事务之前,先讲一个你日常生活中最常干的事:取钱. 比如你去ATM机取1000块钱,大体有两个步骤:首先输入密码金额,银行卡扣掉1000元钱:然后ATM出1000元钱.这两个步骤必须是 ...

  3. spring 事务管理方式及配置

    1.Spring声明式事务配置的五种方式 前段时间对Spring的事务配置做了比较深入的研究,在此之前对Spring的事务配置虽说也配置过,但是一直没有一个清楚的认识.通过这次的学习发觉Spring的 ...

  4. Spring事务的传播特性和隔离级别

    事务的几种传播特性1. PROPAGATION_REQUIRED: 如果存在一个事务,则支持当前事务.如果没有事务则开启2. PROPAGATION_SUPPORTS: 如果存在一个事务,支持当前事务 ...

  5. Spring 事务管理高级应用难点剖析--转

    第 1 部分 http://www.ibm.com/search/csass/search/?q=%E4%BA%8B%E5%8A%A1&sn=dw&lang=zh&cc=CN& ...

  6. spring事务解析

    1 初步理解 理解事务之前,先讲一个你日常生活中最常干的事:取钱. 比如你去ATM机取1000块钱,大体有两个步骤:首先输入密码金额,银行卡扣掉1000元钱:然后ATM出1000元钱.这两个步骤必须是 ...

  7. Spring事务管理(详解+实例)

    1 初步理解 理解事务之前,先讲一个你日常生活中最常干的事:取钱. 比如你去ATM机取1000块钱,大体有两个步骤:首先输入密码金额,银行卡扣掉1000元钱:然后ATM出1000元钱.这两个步骤必须是 ...

  8. 【Spring】11、Spring事务管理

    写这篇博客之前我首先读了<Spring in action>,之后在网上看了一些关于Spring事务管理的文章,感觉都没有讲全,这里就将书上的和网上关于事务的知识总结一下,参考的文章如下: ...

  9. spring事务管理(详解和实例)

    原文地址: 参考地址:https://blog.csdn.net/yuanlaishini2010/article/details/45792069 写这篇博客之前我首先读了<Spring in ...

随机推荐

  1. 委托和lambda表达式,Action和Func

    1.为什么要用委托 我们为什么要有委托?任何东西存在即合理,不合理的也会被时间淘汰掉,委托既然存在肯定有存在的必要,我们来看一下什么时候可以用到委托. 接下来我们有个需求,就是调用一个方法,取出1-1 ...

  2. set集合的常用方法

    set集合是一种无序不重复的集合   add  (self, *args, **kwargs)                                                      ...

  3. coo ceo cfo cto cio 区别

    常见的CEO(Chief executive officer)首席执行官类似总经理.总裁,是企业的法人代表. COO(Chief operating officer)首席运营官 类似常务总经理CFO( ...

  4. Appium+python自动化(三十五)- 命令启动appium之 appium服务命令行参数(超详解)

    简介 前边介绍的都是通过按钮点击启动按钮来启动appium服务,有的小伙伴或者童鞋们乍一听可能不信,或者会问如何通过命令行启动appium服务呢?且听宏哥一一道来. 一睹为快 其实相当的简单,不看不知 ...

  5. HandlerMethodArgumentResolver(一):Controller方法入参自动封装器【享学Spring MVC】

    每篇一句 你的工作效率高,老板会认为你强度不够.你代码bug多,各种生产环境救火,老板会觉得你是团队的核心成员. 前言 在享受Spring MVC带给你便捷的时候,你是否曾经这样疑问过:Control ...

  6. Visual Studio 2019 远程调试工具(Remote Debugger)使用方法

    目录 0.Visual Studio 2019 远程调试工具使用场景 1.Visual Studio 2019 远程调试工具下载地址: 2.Visual Studio 2019 远程调试工具-安装及运 ...

  7. Liunx学习总结(六)--进程

    进程概述 简单来讲程序是一个包含可以执行代码的静态的文件.进程是一个开始执行但是还没有结束的程序的实例.当程序被系统调用到内存以后,系统会给程序分配一定的资源(内存,设备等等)然后进行一系列的复杂操作 ...

  8. python 用加法实现a,b两数相乘

    """思路:1.a * b = a + a + a + ... 2.a * b = n个a相加,只需求证b = n即可 3.用for 循环遍历即可,b就是range的最大 ...

  9. 2019nc#6

    https://ac.nowcoder.com/acm/contest/886#question 题号 标题 已通过代码 题解/讨论 通过率 团队的状态 A Garbage Classificatio ...

  10. P1415 拆分数列 DP

    传送门: 题意: 将一个数字串分成许多不同的小串,使得这些小串代表的数字严格递增,要求最后一个数字尽可能地小. 然后满足字典序尽可能大. 思路: 由于最后一个数字要尽可能地小,所以先处理出每个数的L[ ...