Comments (29)
finally执行失败的情况可能有很多种。。。程序本身挂了, 网络挂了等等
from myth.
定时任务。 你程序挂了,你怎么处理呢 ,请先看下代码
from myth.
我的意思是 你的orderPay的orderMapper.save这一行刚好执行完,然后程序就挂了。。。order表更新了 后面的account和inventory没更新 事务不一致。。。
from myth.
定时任务。 你程序挂了,你怎么处理呢 ,请先看下代码
代码看过了才提的这个问题哈,你的orderPay的orderMapper.save这一行刚好执行完,然后程序就挂了。。。order表更新了 后面的account和inventory没更新 事务不一致。。。
from myth.
挂了,也是你本地事务会提交? 你本地mysql事务呢
from myth.
你看下你的demo代码。。。
from myth.
如果本地有事务,也有问题 你发一个message给消息队列,说执行成功了,但是这时候消息队列返回的response没收到 或者超时了,本地会回滚,但是消息队列那边不知道你回滚了, account和inventory会继续执行下去 还是会事务不一致
from myth.
我最近也在实现这一块,想参考下你这个到底怎么做到不向order服务查询而保证最终一致性的。。看完代码发现并没有实现真的一致性。 兄弟 你缕下是不是
from myth.
不需要查询,myth只管无论你rpc服务挂机或者down掉,都会发消息
from myth.
debug一下试试就能让消息发不出来。。。
from myth.
不知道你怎么debug的,怎么配置的,使用的什么分支?请提供截图?或者其他的,你这么说,我怎么知道?
from myth.
debug一下试试就能让消息发不出来。。。
挂了,也是你本地事务会提交? 你本地mysql事务呢
我想了一种思路不知道合适不合适,首先订单状态要在调完所有的服务调用完之后再更新为成功状态,如你所说如果在下订单成功调用其他服务失败的时候订单的状态不是成功(可以下订单的时候设置为待支付),然后再添加一个定时任务,扫描订单表中待支付的订单,通过ID跟消息表(消息表添加一个订单ID的字段)中的消息进行匹配查看是否发送过消息,如果发送过则进行消息的补偿再发送一条反向记录,未发送则不做处理,最后把订单的状态更新为失效订单。不知道这个思路合不合适,也希望你能谈谈你最近的想法。
from myth.
debug一下试试就能让消息发不出来。。。
挂了,也是你本地事务会提交? 你本地mysql事务呢
我想了一种思路不知道合适不合适,首先订单状态要在调完所有的服务调用完之后再更新为成功状态,如你所说如果在下订单成功调用其他服务失败的时候订单的状态不是成功(可以下订单的时候设置为待支付),然后再添加一个定时任务,扫描订单表中待支付的订单,通过ID跟消息表(消息表添加一个订单ID的字段)中的消息进行匹配查看是否发送过消息,如果发送过则进行消息的补偿再发送一条反向记录,未发送则不做处理,最后把订单的状态更新为失效订单。不知道这个思路合不合适,也希望你能谈谈你最近的想法。
订单设置为待支付不合适哈,订单表保存成功了那他的状态就应该是下单成功。 我现在的做法是在订单库里面加了一张表,记录所有保存了的订单记录,只要是这里面记录了的那就100%是成功的。消息服务prepared状态的定时通过接口查询这张表,查到了就把状态改成commited,没查到就标记为删除。 可以做到代码不侵入,但是order这边必须执行一条我的sql。
from myth.
不知道你怎么debug的,怎么配置的,使用的什么分支?请提供截图?或者其他的,你这么说,我怎么知道?
抱歉公司内网没法给你截图,回家之后也没再下你的项目。现在用的是自己写的项目,你写的这套在大多数情况都不会有问题,但是有些场景确实可以让数据不一致
我用的master分支的spring cloud的demo orderPay的orderMapper.save这个方法你的所有demo都没有加本地事务, 加了本地事务的话你这套逻辑也有问题。我上面已经大概说了什么原因,您那可以自己debug一下就出来了。确实没有实现最终一致性哈
这个issue我关了哈
from myth.
请使用最新的代码
from myth.
请使用最新的代码
/**
该方法无事务
*/
@OverRide
public String orderPay(Integer count, BigDecimal amount) {
final Order order = buildOrder(count, amount);
final int rows = orderMapper.save(order);
//这里只是说ordermapper保存成功了 且ordermapper一定有一条记录了
//就在这打一个断点 你的order已经在数据库里面保存了(因为没有事务) 但是消息还没有发出去
if (rows > 0) {
paymentService.makePayment(order);
}
return "success";
}
from myth.
我去。你在纠结这个? 我这个只是demo,我保证的是 paymentService.makePayment(order); 方法调用rpc的最终一致好吧 ,你在这里打一个断点 挂了和我框架有任何关系吗????
makePayment 方法才和框架有关系。,
再说一遍,这只是demo
from myth.
请使用最新的代码
新代码这样改 实际上没有任何用处,问题的根本是在你的order保存成功之后 消息服务是否能100%保存一条消息,消息服务是通过order调用rest接口保存的,rest我直接给你干掉了,它还保存个啥? kill 的时候finally能发出去,如果我是kill -9 呢,机器直接关机呢? 没法保证的
from myth.
我去。你在纠结这个? 我这个只是demo,我保证的是 paymentService.makePayment(order); 方法调用rpc的最终一致好吧 ,你在这里打一个断点 挂了和我框架有任何关系吗????
makePayment 方法才和框架有关系。,
再说一遍,这只是demo
只保证一个paymentService.makePayment(order)那叫分布式事务?分布式事务要做的不是我a有一个服务 同时调用bcd 但是我a本身也有业务逻辑要处理 ,abcd都成功么?
from myth.
我去。你在纠结这个? 我这个只是demo,我保证的是 paymentService.makePayment(order); 方法调用rpc的最终一致好吧 ,你在这里打一个断点 挂了和我框架有任何关系吗????
makePayment 方法才和框架有关系。,
再说一遍,这只是demo
只保证一个payment太简单了,哪里需要些这么多代码,直接往消息队列刷不就好了吗 分布式事务难做的其中一条就是你刷到消息队列了,但是我本地回滚了,然后消息队列的消费者扣款了,订单缺失败了
from myth.
我艹,我前面的操作,只是为了demo,新增一条数据而已,后面来更新它,你懂吗?makePayment 才是加了分布式事务的注解 好吧。。 如果你不理解,你可以在里面写新增一条数据, 你看清楚这个方法里面做了什么吗???、 只是一个简单的方法? 里面调用了几个rpc?
from myth.
orderPay的orderMapper.save这一行刚好执行完,然后程序就挂了。。。order表更新了 后面的account和inventory没更新 事务不一致。。 我刚仔细看了下, 那你在这个方法上加个本地事务? 不就搞定了‘’》???、、 只是我demo 没写 你就不会了?
from myth.
我去。你在纠结这个? 我这个只是demo,我保证的是 paymentService.makePayment(order); 方法调用rpc的最终一致好吧 ,你在这里打一个断点 挂了和我框架有任何关系吗????
makePayment 方法才和框架有关系。,
再说一遍,这只是demo
我艹,我前面的操作,只是为了demo,新增一条数据而已,后面来更新它,你懂吗?makePayment 才是加了分布式事务的注解 好吧。。 如果你不理解,你可以在里面写新增一条数据, 你看清楚这个方法里面做了什么吗???、 只是一个简单的方法? 里面调用了几个rpc?
我算是明白你的意思了,你这个demo真的是 一万头草泥马在奔腾! 按照你这个做法,我a服务要调用b服务和c服务,同时a服务本身也有业务逻辑要处理,要实现分布式事务我的a服务还得写到消息队列然后去消费再处理业务逻辑是吧? 到底我我不懂 还是你没有去想下我说的问题啊?
from myth.
我真的想说脏话了, 我的demo 做分布式事务 有这么做? (得写到消息队列然后去消费再处理业务逻辑是吧?)
我的意思是,你断点down的位置,和我的框架没有半毛钱关系,
或者我直接告诉你好了, 你把那段代码,移动到 makePayment 方法里面???????
你有没有看清楚代码在做什么啊?
makePayment 方法是保证更新订单状态为 成功,同时更新库存,更新账号,这个是一个分布式事务,只是demo。 当然,你觉得我在做分布式事务之前,写了一条订单垃圾数据,你觉得不行,那你就改一下啊,关键是意思,你懂吧? 我这只是个demo ,你懂吧? 难道你公司的业务和我这个一样?
如果你觉得 先写了一条数据,不舒服,那么你就把那段代码,写到makePayment 方法里面? 然后加个本地事务?
from myth.
我真的想说脏话了, 我的demo 做分布式事务 有这么做? (得写到消息队列然后去消费再处理业务逻辑是吧?)
我的意思是,你断点down的位置,和我的框架没有半毛钱关系,
或者我直接告诉你好了, 你把那段代码,移动到 makePayment 方法里面???????
你有没有看清楚代码在做什么啊?makePayment 方法是保证更新订单状态为 成功,同时更新库存,更新账号,这个是一个分布式事务,只是demo。 当然,你觉得我在做分布式事务之前,写了一条订单垃圾数据,你觉得不行,那你就改一下啊,关键是意思,你懂吧? 我这只是个demo ,你懂吧? 难道你公司的业务和我这个一样?
如果你觉得 先写了一条数据,不舒服,那么你就把那段代码,写到makePayment 方法里面? 然后加个本地事务?
@OverRide
public Object handler(final ProceedingJoinPoint point, final MythTransactionContext mythTransactionContext) throws Throwable {
try {
} catch (Throwable throwable) {
} finally {
//===================发送消息 此处打一个断点不让消息发送 模拟kafka挂了
mythTransactionEngine.sendMessage();
mythTransactionEngine.cleanThreadLocal();
TransactionContextLocal.getInstance().remove();
}
}
===========accountserviceimpl====
@OverRide
@myth(destination = "account")
@transactional(rollbackFor = Exception.class)
public boolean payment(AccountDTO accountDTO) {
....
//======================此处打一个断点 先不返回 模拟网络故障
return Boolean.TRUE;
}
专门又把你代码下下来了
消息队列收不到消息,account结果返回调用方没有收到 我都不知道哪来的信心告诉我说可以最终一致性的?
你是不是会说消息队列这种特殊时候挂的特殊场景太少可以不考虑?
趁你我都还能克制不说脏话的时候先这样咯 爱听不听 当我不懂好了
from myth.
网络故障 rpc不返回? 你把rpc停掉?kafka挂了? 服务挂 了? 重启不会继续发?
from myth.
请问,你好好模拟下?运行一下 ? rpc 挂了,通过mq发,mq挂 了,重启继续发。你的明白?
from myth.
是你没明白吧。。发送方挂了 发个屁啊还 。。我没模拟给你说个啥? 别回了 谢谢了
from myth.
不懂原理就不要来这说,谢谢,你可以不用。搞的自己好像很厉害一样
from myth.
Related Issues (20)
- demo工程下单业务中,保存订单信息和记录事务日志信息不在同一个库,数据一致性是如何考虑的
- 关于事务落库后,业务操作失败的情况怎么处理?
- 在参与者失败的时候如何通知到发起者? HOT 1
- 提供者报未知异常,消息消费端不能set重试次数,会报npe HOT 4
- spring cloud kafka一直扣用户余额 HOT 2
- 请教一个问题,是不是不建议用kafka作为消息队列
- 请问可以修改成只使用spring 配置文件么 HOT 1
- demo-springcloud 缺少http-core jar HOT 1
- 持有过多的数据库连接不释放,导致数据库连接错误 HOT 3
- 最新的项目下载后,配置后,试着dead掉一些项目,无恢复功能 HOT 1
- 当扣除余额的操作未发生异常,而减库存操作发生了异常时,扣除余额的数据库操作正常进行提交,并不会回滚。 HOT 1
- 我提一个比较少见的情况,微服务之间互相调用,是否支持分布式事务
- 新建项目 恢复服务报错 No qualifying bean of type 'xxx.xxx' available HOT 4
- 适配一下最新的spring-amqp、spring-rabbit版本 最新版的部分类已经转义到其他package中 HOT 1
- 接收mq消息重试时,SpringCloudMythTransactionInterceptor 拦截器 异常 HOT 3
- 是否支持 “异步的分布式系统” 的事务控制?
- “NoSuchMethodErrors” due to multiple versions of org.slf4j:slf4j-api:jar HOT 4
- myth文档的迁移到官网和翻译 HOT 1
- my-springcloud依赖servlet有问题
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 myth.