“Spring”事务管理器
原始时代:jdbc
- 手动创建 connection、Statement等;
- 手动处理open, close等操作;
- 大概的重复框架代码、业务代码少;
农业时代:mybatis, hibernate, jpa
- 封装了框架代码,程序员只需要关注业务逻辑;
- 角度转化成session, sessionFactory;
工业时代:pool, 主从分离,读写分离
1.池化-复用连接,减少创建与销毁连接代价;
2.数据库集群化:双master, 一主多从, 读写分离;
信息时代:spring-transaction, mybatis-spring
- 在JAVA生态中数据库连接高度与spring框架融合,提升开发效能;
- 提供便捷的事务管理(事务隔离、事务传播机制);
智能时代:开源融合
1.各公司机基于开源工具提供个性化的功能 例:zebra;
executeUpdate():203, GroupPreparedStatement (com.dianping.zebra.group.jdbc), GroupPreparedStatement.java
execute():145, GroupPreparedStatement (com.dianping.zebra.group.jdbc), GroupPreparedStatement.java
invoke0(Method, Object, Object[]):-1, NativeMethodAccessorImpl (sun.reflect), NativeMethodAccessorImpl.java
invoke(Object, Object[]):62, NativeMethodAccessorImpl (sun.reflect), NativeMethodAccessorImpl.java
invoke(Object, Object[]):43, DelegatingMethodAccessorImpl (sun.reflect), DelegatingMethodAccessorImpl.java
invoke(Object, Object[]):498, Method (java.lang.reflect), Method.java
invoke(Object, Method, Object[]):59, PreparedStatementLogger (org.apache.ibatis.logging.jdbc), PreparedStatementLogger.java
execute():-1, $Proxy230 (com.sun.proxy), Unknown Source
update(Statement):46, PreparedStatementHandler (org.apache.ibatis.executor.statement), PreparedStatementHandler.java
update(Statement):74, RoutingStatementHandler (org.apache.ibatis.executor.statement), RoutingStatementHandler.java
doUpdate(MappedStatement, Object):50, SimpleExecutor (org.apache.ibatis.executor), SimpleExecutor.java
update(MappedStatement, Object):117, BaseExecutor (org.apache.ibatis.executor), BaseExecutor.java
update(MappedStatement, Object):76, CachingExecutor (org.apache.ibatis.executor), CachingExecutor.java
invoke0(Method, Object, Object[]):-1, NativeMethodAccessorImpl (sun.reflect), NativeMethodAccessorImpl.java
invoke(Object, Object[]):62, NativeMethodAccessorImpl (sun.reflect), NativeMethodAccessorImpl.java
invoke(Object, Object[]):43, DelegatingMethodAccessorImpl (sun.reflect), DelegatingMethodAccessorImpl.java
invoke(Object, Object[]):498, Method (java.lang.reflect), Method.java
invoke(Object, Method, Object[]):63, Plugin (org.apache.ibatis.plugin), Plugin.java
update(MappedStatement, Object):-1, $Proxy228 (com.sun.proxy), Unknown Source
update(String, Object):198, DefaultSqlSession (org.apache.ibatis.session.defaults), DefaultSqlSession.java
insert(String, Object):185, DefaultSqlSession (org.apache.ibatis.session.defaults), DefaultSqlSession.java
invoke0(Method, Object, Object[]):-1, NativeMethodAccessorImpl (sun.reflect), NativeMethodAccessorImpl.java
invoke(Object, Object[]):62, NativeMethodAccessorImpl (sun.reflect), NativeMethodAccessorImpl.java
invoke(Object, Object[]):43, DelegatingMethodAccessorImpl (sun.reflect), DelegatingMethodAccessorImpl.java
invoke(Object, Object[]):498, Method (java.lang.reflect), Method.java
invoke(Object, Method, Object[]):433, SqlSessionTemplate$SqlSessionInterceptor (org.mybatis.spring), SqlSessionTemplate.java
insert(String, Object):-1, $Proxy155 (com.sun.proxy), Unknown Source
insert(String, Object):278, SqlSessionTemplate (org.mybatis.spring), SqlSessionTemplate.java
execute(SqlSession, Object[]):57, MapperMethod (org.apache.ibatis.binding), MapperMethod.java
invoke(Object, Method, Object[]):59, MapperProxy (org.apache.ibatis.binding), MapperProxy.java
insertSelective(TransportPO):-1, $Proxy169 (com.sun.proxy), Unknown Source
replaceTransport(TransportPO):33, InnerTransportService (com.sankuai.qcs.driver.transport.test.mapper), InnerTransportService.java
invoke(int, Object, Object[]):-1, InnerTransportService$$FastClassBySpringCGLIB$$476ba63c (com.sankuai.qcs.driver.transport.test.mapper), <generated>
invoke(Object, Object[]):204, MethodProxy (org.springframework.cglib.proxy), MethodProxy.java
invokeJoinpoint():747, CglibAopProxy$CglibMethodInvocation (org.springframework.aop.framework), CglibAopProxy.java
proceed():163, ReflectiveMethodInvocation (org.springframework.aop.framework), ReflectiveMethodInvocation.java
proceedWithInvocation():-1, 1053212607 (org.springframework.transaction.interceptor.TransactionInterceptor$$Lambda$303), Unknown Source
invokeWithinTransaction(Method, Class, TransactionAspectSupport$InvocationCallback):294, TransactionAspectSupport (org.springframework.transaction.interceptor), TransactionAspectSupport.java
invoke(MethodInvocation):98, TransactionInterceptor (org.springframework.transaction.interceptor), TransactionInterceptor.java
proceed():185, ReflectiveMethodInvocation (org.springframework.aop.framework), ReflectiveMethodInvocation.java
intercept(Object, Method, Object[], MethodProxy):689, CglibAopProxy$DynamicAdvisedInterceptor (org.springframework.aop.framework), CglibAopProxy.java
replaceTransport(TransportPO):-1, InnerTransportService$$EnhancerBySpringCGLIB$$1afa4103 (com.sankuai.qcs.driver.transport.test.mapper), <generated>
replaceTransport():75, TransportExtendMapperTest (com.sankuai.qcs.driver.transport.test.mapper), TransportExtendMapperTest.java
找到几个关键的点
事务切面
invoke(MethodInvocation):98, TransactionInterceptor (org.springframework.transaction.interceptor), TransactionInterceptor.java
Mybatis扫描代理
invoke(Object, Method, Object[]):59, MapperProxy (org.apache.ibatis.binding), MapperProxy.java
SqlSessionTemplate (sqlSession)
insert(String, Object):278, SqlSessionTemplate (org.mybatis.spring), SqlSessionTemplate.java
SqlSession sqlSession = getSqlSession(
SqlSessionTemplate.this.sqlSessionFactory,
SqlSessionTemplate.this.executorType,
SqlSessionTemplate.this.exceptionTranslator);
DefaultSqlSessionFactory

1.Environment里面有Datasource;
2.在这里已经生成了CachingExecutor;
委托 DefaultSqlSession
insert(String, Object):185, DefaultSqlSession (org.apache.ibatis.session.defaults), DefaultSqlSession.java
- Mybatis 中的类Configuration 里有定义 Map<String, MappedStatement> mappedStatements存放着;

委托 SimpleExecutor执行
doUpdate(MappedStatement, Object):50, SimpleExecutor (org.apache.ibatis.executor), SimpleExecutor.java
stmt = prepareStatement(handler, ms.getStatementLog());
获取Connection(里面是Zebra 的GroupConnection)

DataSourceUtils (spring-jdbc), 先获取到DataSource (SpringManagedTransaction 类定义了)

是在这里生成SpringManagedTransaction的,同时DataSource也是在这里由environment给予的
tx = transactionFactory.newTransaction(environment.getDataSource(), level, autoCommit);
DefaultSqlSessionFactory 是一个非常重要的类;
委托 PreparedStatementHandler
update(Statement):46, PreparedStatementHandler (org.apache.ibatis.executor.statement), PreparedStatementHandler.java
GroupPreparedStatement 最终来执行
execute():145, GroupPreparedStatement (com.dianping.zebra.group.jdbc), GroupPreparedStatement.java
源码分析
TransactionInterceptor
委托:TransactionAspectSupport
mybatis-spring 依赖spring-jdbc mybatis等;
spring-tx 依赖spring-beans spring-core
spring-jdbc 依赖spring-beans spring-core spring-tx
参考
https://blog.csdn.net/HLhakey/article/details/84062671
https://cloud.tencent.com/developer/article/1497631
数据库读写分离与事务纠缠的那点坑
网友评论