TX-LCN原理V4.1.0-springboot2.0.x
2022-06-09 16:02:20 0 举报
LCN原理,基于4.1.0-springboot版本的Demo
作者其他创作
大纲/内容
获取事务组KEYgetTxGroupKey(groupId);key:tx:manager:default:${groupId}
point.proceed()
发送请求
MapperMethod#execute
获取任务信息ConditionUtils.getInstance().getTask(key);
responseMsg
AspectBeforeServiceImpl#around()
执行本地方法Object res = point.proceed();
绑定管道对象,检查网络setChannel(txGroup.getList());
TransactionAspectSupport#createTransactionIfNecessary
调其他服务
SocketManager#sendMsg
事务发起方TxStartTransactionServerImpl
等待任务task.awaitTask();
SpringManagedTransaction#getConnection
事务参与方TxRunningNoTransactionServerImpl
事务参与方(有事务)TxRunningTransactionServerImpl
分装事务信息TxTransactionInfo
全局事务否达到maxCount
SimpleExecutor#prepareStatement
spring中执行事务拦截TransactionInterceptor#invoke
获取请求中的事务信息tx-group,tx-mode(发起方其信息为null)
创建任务Task
AbstractResourceProxy#createLcnConnection
否
获取等待任务waitTask控制本地事务的数据提交
around()
获取事务组信息getTxGroup(groupId);
Redis中保存事务信息
获取数据库连接
设置回调【IBack】返回事务组信息
创建定时任务【1s内无返回则自动唤醒线程】
获取分布式事务服务TransactionServer#createTransactionServer(info);
创建事务组ActionCGServiceImpl
LCNDBConnection#transaction
返回事务组信息(不包括事务组中的明细)
连接TM创建事务组createTransactionGroup(groupId);
Server...
TxManagerService#addTransactionGroup
加入到事务组中addTransactionGroup
事务参与方(无事务)TxRunningNoTransactionServerImpl
发送给TM
是否成功
拦截@TxTransaction
事务拦截TransactionAspect
新建TxInfo对象
TransactionAspectSupport#invokeWithinTransaction
构建Request对象action:atgparam:{\"g\
将TxInfo对象添加到事务组中txGroup.addTransactionInfo(txInfo);
设置分布式事务到本地线程TxTransactionLocal
创建事务组txManagerService.createTransactionGroup(groupId);
mybatis中的MapperProxy#invoke
包装连接为LCNStartConnection或者LCNDBConnection
Server1
超时返回正常连接
项目中的连接拦截DataSourceAspect#around
起始
执行本地方法Object obj = point.proceed();
DataSourceTransactionManager#doBegin
事务传播行为由此控制
如果未开始等待则轮询睡眠1ms等待其进入等待状态
执行本地方法return point.proceed();
有
state = 1
AbstractResourceProxy#createConnection
lcnConnection.getConnection(point);
构建Request对象action:cgparam:{g:${groupId}}
任务在等待中则唤醒等待中的任务
TxManagerInterceptor
有无事务
提交发送请求任务
标记事务完成
Connection con = dataSource.getConnection();
全局事务
Connection newCon = obtainDataSource().getConnection();
AbstractPlatformTransactionManager#getTransaction
是
DruidDataSource#getConnection(long)
Request
根据Action查询相应的处理TxCoreServerHandler#service
LCNStartConnection#transaction
最终处理
根据key与类型创建等待任务
事务参与方TxRunningTransactionServerImpl
返回连接
分装拦截方法源信息TransactionInvocation
state = rollbackException()为设定的非回滚异常返回1,其他返回0
事务组信息存入Redis中(30s)key:tx:manager:default:${groupId}
等待重试30s
获取Task回调返回值(事务组信息)
唤醒
添加事务组ActionATGServiceImpl
无
返回结果
DataSourceUtils#getConnection
获取分布式 事务组ID
确认TxManagerSenderService#confirm(txGroup);
initLCNConnection((Connection) point.proceed());
NettyControlServiceImpl#executeService
关闭事务组ActionCTGServiceImpl
SqlSessionTemplate#insert
0 条评论
回复 删除
下一页