有事务和没事务的执行流程

问题:群里有人提出连接池在有事务和没事务的情况下(spring+mybatis),一个service中调用了几个mapper,那么每个mapper用的连接是同一个吗?
分析:经测试在有事务的情况下用的连接是同一个,无事务的情况下用的连接不是同一个。一般对于CUD操作来说都要设置REQUIRED事务,R操作也要设置事务SUPPORT+readonly。不推荐无事务的方法。

mybatis执行流程(无spring事务集成):
1、MapperProxy.invoke()
2、SqlSessionTemplate$SqlSessionInterceptor.invoke()
3、new一个DefaultSqlSession
4、取connection
5、从Configuration中得到MappedStatement,设置pstmt参数,执行sql语句。【MappedStatement是在xxxMapper实例化的时候去mapper.xml中解析的】
6、得到resultSet,解析rs。
7、关闭sqlSession,还connection。

没有spring事务的情况下:
1、xxxMapper是一个代理,真正执行逻辑的是MapperProxy.invoke()->MapperMethod.execute()->SqlSessionTemplate.CRUD()
2、在sqlSessionTemplate中用到了SqlSession,也是一个代理,执行逻辑的是SqlSessionInterceptor.invoke(),
3、在SqlSessionInterceptor.invoke()中去获取SqlSession,首先是从TransactionSynchronizationManager.resources中获取,为null去new一个DefaultSqlSession(同时创建一个新的SpringManagedTransaction),然后判断如果有spring事务就会把sqlSession绑定到TransactionSynchronizationManager.resources,并添加SqlSessionSynchronization【这里没有spring事务,所以不会绑定和添加】,
4、然后判断TransactionSynchronizationManager.isSynchronizationActive()是否当前线程开启了事务同步,这里返回false,在SimpleExecutor中去获取数据库连接(这时出发连接池初始化(druid)),
5、得到的connection对象的autocommit=true(如果有事务,在事务的doBegin方法中会把autocommit=false),SqlSessionInterceptor.invoke()中判断是否sqlSession有事务,如果没有则执行sqlSession.commit(),在这里执行SpringManangedTransaction.commit()【注:这里虽然叫SpringManagedTransaction,但是它和spring事务没有任何关系,同时由于autocommit=true,因此也不会提交事务】,然后执行sqlSession.close(),把connection还给druid。
多个xxxMapper就重复上面的步骤。新的connection,新的sqlSession,新的SpringManagedTransaction。

在有spring事务的情况执行流程:
1、xxxService会被cglib重写,执行DynamicAdvisedInterceptor.intercept(), 执行TransactionInterceptor.invode()->invokeWithinTransaction(),
2、在DataSourceTransactionManager.doBegin()中取得Connection连接,取消自动提交,设置隔离级别和事务超时时间,绑定当前connection到threadLocal,
3、然后转回xxxService中执行xxxMapper方法。
xxxMapper是代理,执行进入MapperProxy,进入MapperMethod,进入SqlSessionTemplate,sqlSessionTemplate中,sqlSessionProxy又是SqlSessionInterceptor代理,在SqlSessionInterceptor的invoke()中,得到DefaultSqlSession,把它绑定到TransactionSynchronizationManager.resources,【DefaultSqlSession绑定到线程是关键,所有操作都用的是同一个sqlSession(connection),这样抱着了事务】
4、mybatis执行完毕
5、spring提交事务,在DataSourceTransactionManager.triggerBeforeCommit()中调用SqlSessionSynchronization.beforeCommit()去做一些清除缓存工作(并不提交事务),从TransactionSynchronizationManager.resources中释放sqlSession。
6、提交事务
7、通知SqlSessionSynchronization.afterCommit()
8、从线程ThreadLocal中释放dataSource
9、复原connection原先的autocommit=true和隔离级别
10、还connection到连接池
11、如果是嵌套事务,那么在开始本事务之前要保存前面的事务,在完成本事务后继续执行前面的事务。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,657评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,889评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,057评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,509评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,562评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,443评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,251评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,129评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,561评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,779评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,902评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,621评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,220评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,838评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,971评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,025评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,843评论 2 354

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,656评论 18 139
  • 前面的章节主要讲mybatis如何解析配置文件,这些都是一次性的初始化过程。从本章开始讲解动态的过程,它们跟应用程...
    七寸知架构阅读 4,940评论 2 55
  • # 前言 在java程序员的世界里,最熟悉的开源软件除了 Spring,Tomcat,还有谁呢?当然是 Mybat...
    莫那一鲁道阅读 3,290评论 3 11
  • 单独使用mybatis是有很多限制的(比如无法实现跨越多个session的事务),而且很多业务系统本来就是使用sp...
    七寸知架构阅读 3,446评论 0 53
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,810评论 6 342