梦中惊醒
在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年 的码农,现在任架构师。喜欢研究技术,崇尚简单快乐。 追求以通俗易懂的语言解说技术,希望所有的读者都能看懂并记住。 下面是公众号和知识星球的二维码,欢迎关注!