Comments (15)
你主要观察一下参与模块的日志信息,看一下参与模块有没有参与到事务中。正常会看到tx-running-start end 的日志打印。再就是提交或者回滚的日志打印消息
from tx-lcn.
@1991wangliang 看了下客户端日志,start 和 end 是有的,但是没有回滚相关的信息。
2017-11-20 18:20:04,941:INFO 56:http-nio-7071-exec-1(5) TxStartTransactionServerImpl.java:36 - tx-start
2017-11-20 18:20:04,945:INFO 83:pool-4-thread-2(5) SocketManager.java:84 - send-msg->{"a":"cg","k":"tMZ9NGnl","p":{}}
2017-11-20 18:20:04,947:INFO 40:nioEventLoopGroup-2-1(10) TransactionHandler.java:51 - 接受->{"d":"{\"st\":1511173204945,\"s\":0,\"nt\":1511173204946,\"g\":\"VIvaGzTf\",\"i\":0,\"o\":0}","k":"tMZ9NGnl"}
2017-11-20 18:20:04,963:INFO 56:http-nio-7071-exec-1(5) ServiceLogAspect.java:36 - SERVICE START: classMethod=>com.tangdi.boot.sample.service.impl.ClientServiceImpl.addOne, args=>[com.tangdi.boot.sample.entity.Client@e392521[name=test01,version=0.0.1,status=1,createTime=<null>,updateTime=<null>,id=<null>]]
2017-11-20 18:20:06,021:WARN 90:hystrix-sample-cloud-server-1(5) ServerConsumerFallback.java:20 - [post] consumer /server fallback
2017-11-20 18:20:06,054:INFO 56:http-nio-7071-exec-1(5) ServiceLogAspect.java:41 - SERVICE END: spendTime=>1105ms, return=>com.tangdi.boot.sample.entity.Client@e392521[name=test01,version=0.0.1,status=1,createTime=20171120182005,updateTime=<null>,id=8]
2017-11-20 18:20:06,070:INFO 92:pool-4-thread-3(5) SocketManager.java:84 - send-msg->{"a":"ctg","k":"wMHBuV7C","p":{"s":1,"g":"VIvaGzTf"}}
2017-11-20 18:20:06,072:INFO 40:nioEventLoopGroup-2-1(10) TransactionHandler.java:51 - 接受->{"d":"1","k":"wMHBuV7C"}
2017-11-20 18:20:06,106:INFO 56:http-nio-7071-exec-1(5) TxStartTransactionServerImpl.java:81 - tx-end-VIvaGzTf>1
倒是服务端没有 start end 这些信息。
from tx-lcn.
tx-start、tx-end 是客户端(启动方)的日志,tx-running-start/tx-running-end 是服务(参与方)的日志,你的参与方没有这样的日志那么首先怀疑你的参与方没有配置好,可能与你的配置有关系。再就是你的发起方既然有日志了 但是没有回滚,是由于你客户端发起并没有出现异常,你只是走了fallback而已。(LCN本身不会创建事务的,只是会协调事务)
from tx-lcn.
{"a":"ctg","k":"wMHBuV7C","p":{"s":1,"g":"VIvaGzTf"}} 协议文档有介绍,其中s标示的事务模块正常执行。非异常状态,这也是不会回滚事务的
from tx-lcn.
@1991wangliang
话说启动方和参与方,在配置文件上,应该没区别吧。
我对比了一下两方的配置文件,是一样的。
在使用方面,也和demo一样,启动方的service加上@TxTransaction
,但参与方的不需要。
但是参与方的日志里面始终没有出现 tx-running-start/tx-running-end 这样的日志。。。
from tx-lcn.
那说明应该是你在发起方的时候没有将数据传递给参与方模块(groupId),你可以在configuration下的配置requestintercept是否将数据传递出去。可以加断点看一下。怀疑你这里是多线程的方式调用的,threadlocal就拿不到数据了.
from tx-lcn.
@1991wangliang
一提到多线程,突然发现demo中,
只有在feign.hystrix.enabled=true
的情况下,才有调整hystrix的策略:
hystrix.command.default.execution.isolation.strategy= SEMAPHORE
修改之后,果然参与方出现了相关日志。。。
2017-11-21 12:00:58,846:INFO 56:http-nio-7070-exec-3(5) TxRunningTransactionServerImpl.java:44 - tx-running-start->p4k8h93u
2017-11-21 12:00:58,848:INFO 56:http-nio-7070-exec-3(5) ServiceLogAspect.java:36 - SERVICE START: classMethod=>com.tangdi.boot.sample.service.impl.ServerServiceImpl.addOne, args=>[com.tangdi.boot.sample.entity.Server@374ac92c[name=test01-server,version=0.0.1,status=1,createTime=<null>,updateTime=<null>,id=<null>]]
2017-11-21 12:00:58,849:INFO 56:http-nio-7070-exec-3(5) LCNDBConnection.java:60 - task-create-> datasource_fx1lQvI4
2017-11-21 12:00:58,850:INFO 56:http-nio-7070-exec-3(5) LCNTransactionDataSource.java:38 - get new connection ->p4k8h93u
2017-11-21 12:00:58,851:INFO 56:http-nio-7070-exec-3(5) LCNDBConnection.java:103 - rollback
2017-11-21 12:00:58,858:INFO 56:http-nio-7070-exec-3(5) LCNDBConnection.java:128 - close-state->0,p4k8h93u
2017-11-21 12:00:58,860:INFO 56:http-nio-7070-exec-3(5) LCNDBConnection.java:113 - close-connection->p4k8h93u
2017-11-21 12:00:58,861:INFO 56:http-nio-7070-exec-3(5) LCNDBConnection.java:139 - rollback->p4k8h93u
2017-11-21 12:00:58,861:INFO 56:http-nio-7070-exec-3(5) TxRunningTransactionServerImpl.java:100 - tx-running-end->p4k8h93u,time->14
但是发起方仍未做回滚。。。
2017-11-21 12:00:58,830:INFO 58:http-nio-7071-exec-3(5) TxStartTransactionServerImpl.java:36 - tx-start
2017-11-21 12:00:58,831:INFO 102:pool-4-thread-4(5) SocketManager.java:84 - send-msg->{"a":"cg","k":"pWo9HVuq","p":{}}
2017-11-21 12:00:58,833:INFO 40:nioEventLoopGroup-2-1(10) TransactionHandler.java:51 - 接受->{"d":"{\"st\":1511236858832,\"s\":0,\"nt\":1511236858832,\"g\":\"p4k8h93u\",\"i\":0,\"o\":0}","k":"pWo9HVuq"}
2017-11-21 12:00:58,834:INFO 58:http-nio-7071-exec-3(5) ServiceLogAspect.java:36 - SERVICE START: classMethod=>com.tangdi.boot.sample.service.impl.ClientServiceImpl.addOne, args=>[com.tangdi.boot.sample.entity.Client@44810af7[name=test01,version=0.0.1,status=1,createTime=<null>,updateTime=<null>,id=<null>]]
Hibernate: insert into CLIENT (CREATE_TIME, UPDATE_TIME, STATUS, NAME, VERSION) values (?, ?, ?, ?, ?)
2017-11-21 12:00:58,879:INFO 58:http-nio-7071-exec-3(5) ServiceLogAspect.java:41 - SERVICE END: spendTime=>45ms, return=>com.tangdi.boot.sample.entity.Client@44810af7[name=test01,version=0.0.1,status=1,createTime=20171121120058,updateTime=<null>,id=10]
2017-11-21 12:00:58,880:INFO 107:pool-4-thread-5(5) SocketManager.java:84 - send-msg->{"a":"ctg","k":"8zm3LLvj","p":{"s":1,"g":"p4k8h93u"}}
2017-11-21 12:00:58,882:INFO 40:nioEventLoopGroup-2-1(10) TransactionHandler.java:51 - 接受->{"d":"1","k":"8zm3LLvj"}
2017-11-21 12:00:58,886:INFO 58:http-nio-7071-exec-3(5) TxStartTransactionServerImpl.java:81 - tx-end-p4k8h93u>1
也就是说,发起方必须手动抛出异常,才能引发回滚操作,而不是tx-manager通过消息通知触发?
from tx-lcn.
是的,只有触发异常才会执行回滚的。
from tx-lcn.
@1991wangliang 原来如此,了解了,感谢。
from tx-lcn.
@1991wangliang 再咨询一个问题。。。
发起方调用的某个方法如果抛出RuntimeException,为啥不会触发参与方的事物回滚。。。
而直接在在service方法中抛出则没问题。
@Override
@TxTransaction
@Transactional(rollbackFor = Exception.class)
public Client addOne(Client entity) {
Map<String, String> map = new HashMap<>(3);
map.put("name", entity.getName() + "-server");
map.put("version", entity.getVersion());
map.put("status", entity.getStatus().toString());
String result = serverConsumer.addOne(map);
// 这个方法抛出 RuntimeException 不会触发参与方回滚
parseConsumerResult(result, true);
// 这里可以成功触发参与方回滚
// lcn tx starter should throw exception to make service provider rollback
if (entity.getStatus() == 1) {
throw new RuntimeException("status should be 0");
}
return super.addOne(entity);
}
更新一下,上面的描述不对,
应该是参与方调用超时(参与方再保存数据之后,sleep了5秒钟),发起方进入_fallback_之后
parseConsumerResult
这个方法解析了_fallback_的返回值,抛出RuntimeException
这个情况下无法触发参与方的回滚。。。
from tx-lcn.
看一下tx-start的打印日志
from tx-lcn.
@1991wangliang 刚才更新了一下描述。。。
更新一下,上面的描述不对,
应该是参与方调用超时(参与方再保存数据之后,sleep了5秒钟),发起方进入fallback之后
parseConsumerResult这个方法解析了fallback的返回值,抛出RuntimeException
这个情况下无法触发参与方的回滚。。。
日志方面的话:
- 发起方:
2017-11-21 17:05:39,426:INFO 57:http-nio-7071-exec-2(5) TxStartTransactionServerImpl.java:36 - tx-start
2017-11-21 17:05:39,429:INFO 97:pool-4-thread-4(5) SocketManager.java:84 - send-msg->{"a":"cg","k":"Z04sl2YI","p":{}}
2017-11-21 17:05:39,431:INFO 40:nioEventLoopGroup-2-1(10) TransactionHandler.java:51 - 接受->{"d":"{\"st\":1511255139430,\"s\":0,\"nt\":1511255139430,\"g\":\"Lkl1ZPMZ\",\"i\":0,\"o\":0}","k":"Z04sl2YI"}
2017-11-21 17:05:39,435:INFO 57:http-nio-7071-exec-2(5) ServiceLogAspect.java:36 - SERVICE START: classMethod=>com.tangdi.boot.sample.service.impl.ClientServiceImpl.addOne, args=>[com.tangdi.boot.sample.entity.Client@79f5a58e[name=test01,version=0.0.1,status=1,createTime=<null>,updateTime=<null>,id=<null>]]
2017-11-21 17:05:44,438:WARN 88:HystrixTimer-1(5) ConsumerHelper.java:25 - [POST /server] fallback
2017-11-21 17:05:44,441:INFO 57:http-nio-7071-exec-2(5) ConsumerHelper.java:41 - Call consumer result: {"code":201,"message":"[POST /server] Service fallback"}
2017-11-21 17:05:44,496:INFO 101:pool-4-thread-5(5) SocketManager.java:84 - send-msg->{"a":"ctg","k":"YrofVsoI","p":{"s":0,"g":"Lkl1ZPMZ"}}
2017-11-21 17:05:44,500:INFO 40:nioEventLoopGroup-2-1(10) TransactionHandler.java:51 - 接受->{"d":"0","k":"YrofVsoI"}
2017-11-21 17:05:44,506:INFO 57:http-nio-7071-exec-2(5) TxStartTransactionServerImpl.java:81 - tx-end-Lkl1ZPMZ>0
2017-11-21 17:05:44,508:ERROR 57:http-nio-7071-exec-2(5) GlobalExceptionHandler.java:28 - [POST /server] Service fallback
java.lang.RuntimeException: [POST /server] Service fallback
at com.tangdi.boot.common.helper.ConsumerHelper.parseConsumerResult(ConsumerHelper.java:49) ~[classes/:?]
at com.tangdi.boot.sample.service.impl.ClientServiceImpl.addOne(ClientServiceImpl.java:44) ~[classes/:?]
- 参与方:
2017-11-21 17:05:39,442:INFO 55:http-nio-7070-exec-2(5) TxRunningTransactionServerImpl.java:44 - tx-running-start->Lkl1ZPMZ
2017-11-21 17:05:39,443:INFO 55:http-nio-7070-exec-2(5) ServiceLogAspect.java:36 - SERVICE START: classMethod=>com.tangdi.boot.sample.service.impl.ServerServiceImpl.addOne, args=>[com.tangdi.boot.sample.entity.Server@5c1cc194[name=test01-server,version=0.0.1,status=1,createTime=<null>,updateTime=<null>,id=<null>]]
Hibernate: insert into SERVER (CREATE_TIME, UPDATE_TIME, STATUS, NAME, VERSION) values (?, ?, ?, ?, ?)
2017-11-21 17:05:44,461:INFO 55:http-nio-7070-exec-2(5) ServiceLogAspect.java:41 - SERVICE END: spendTime=>5019ms, return=>com.tangdi.boot.sample.entity.Server@5c1cc194[name=test01-server,version=0.0.1,status=1,createTime=20171121170539,updateTime=<null>,id=9]
2017-11-21 17:05:44,463:INFO 55:http-nio-7070-exec-2(5) TxRunningTransactionServerImpl.java:100 - tx-running-end->Lkl1ZPMZ,time->5020
from tx-lcn.
参与方模块应该会有提交或者回滚的指令数据吧?你现在tx-start状态确实是回滚的状态。
from tx-lcn.
@1991wangliang
Orz。。。实在不好意思。。。
刚才在修改参与方service的时候,发现忘记添加@Transactional
了。。。
现在应该可以了,日志里提示 事务模块网络异常回滚
非常感谢。。。
from tx-lcn.
ok 好的
from tx-lcn.
Related Issues (20)
- io.netty.handler.codec.DecoderException: com.codingapi.txlcn.common.exception.SerializerException: java.lang.ClassNotFoundException: org.springframework.orm.jpa.JpaSystemException HOT 1
- tx-manager多节点部署 HOT 1
- tx-lcn.primary-key-package HOT 2
- tm服务重启后,client端不能自动重连 HOT 2
- 5.0.2 A->B->C,如果B应用执行时间超过1秒,就直接异常了。如何修改这个最大等待时间? HOT 1
- TX-LCN是否支持mysql多数据源(mysql一主一从)
- openfeign调用,事务不能传递? HOT 5
- [5.0.2] LCN TM 通知 TC 失败导致数据不一致 HOT 17
- [5.0.2] LCN TM 通知 TC 失败导致数据不一致
- 当下游服务出现异常,下游服务catch了异常那上游服务的事务基于LCN会回滚吗
- 在跨服务调用的时候,经常会偶发性报这个错。 HOT 1
- SpringCloud 集群(tx-lcn.springcloud.loadbalance.enabled=true)
- 请问作者这个支持达梦数据库?
- TXC模式,flowable工作流的TaskService.complete(),解析的逆向sql执行失败
- TM启动正常,但日志总redis命令执行错误! HOT 2
- Redis在Lcn中的使用如何保证跟数据库中事务组数据的一致性,如果redis节点宕机,怎么保证事务组的事务提交和回滚正常?
- tx-Icn现在不维护了吗 HOT 1
- 集成Caused by: java.sql.SQLFeatureNotSupportedException: getCatalog HOT 1
- 监听事务提交后执行 HOT 1
- JDK 需要升级到17 以上
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from tx-lcn.