美文网首页
2020-06-03

2020-06-03

作者: 爱技术人9ed3f | 来源:发表于2020-06-11 10:20 被阅读0次

“Spring”事务管理器

原始时代:jdbc

  1. 手动创建 connection、Statement等;
  2. 手动处理open, close等操作;
  3. 大概的重复框架代码、业务代码少;

农业时代:mybatis, hibernate, jpa

  1. 封装了框架代码,程序员只需要关注业务逻辑;
  2. 角度转化成session, sessionFactory;

工业时代:pool, 主从分离,读写分离

1.池化-复用连接,减少创建与销毁连接代价;
2.数据库集群化:双master, 一主多从, 读写分离;

信息时代:spring-transaction, mybatis-spring

  1. 在JAVA生态中数据库连接高度与spring框架融合,提升开发效能;
  2. 提供便捷的事务管理(事务隔离、事务传播机制);

智能时代:开源融合

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

image.png

1.Environment里面有Datasource;
2.在这里已经生成了CachingExecutor;

委托 DefaultSqlSession

insert(String, Object):185, DefaultSqlSession (org.apache.ibatis.session.defaults), DefaultSqlSession.java

  1. Mybatis 中的类Configuration 里有定义 Map<String, MappedStatement> mappedStatements存放着;
image.png

委托 SimpleExecutor执行

doUpdate(MappedStatement, Object):50, SimpleExecutor (org.apache.ibatis.executor), SimpleExecutor.java

stmt = prepareStatement(handler, ms.getStatementLog());
获取Connection(里面是Zebra 的GroupConnection)


image.png

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


image.png

是在这里生成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
数据库读写分离与事务纠缠的那点坑

https://github.com/Snailclimb/JavaGuide

https://juejin.im/post/5dcaa0fd51882557486c2de6

相关文章

网友评论

      本文标题:2020-06-03

      本文链接:https://www.haomeiwen.com/subject/yckizhtx.html