[数据库回滚] 谁做过人民币扣款回滚

2020-10-15 18:55:07 +08:00
 cquptzzq
问题:滴滴扣款按照优惠券、余额、支付宝 /微信三个步骤,设计这个过程,考虑不成功的回滚操作

我记得回滚是不支持嵌套的,mysql 在你开第二个事务时候就已经把第一个事务提交了,所以该怎么写余额、支付宝、微信都没钱,扣款失败的代码呢?
还有就是高并发情况下有什么要注意的特殊点呢?
请各位赐教,谢谢。
2348 次点击
所在节点    程序员
10 条回复
a719114136
2020-10-15 19:00:06 +08:00
先创建订单,然后 app 用这笔订单发起支付。

不太懂为啥要回滚,挨个扣款过去不就行了
cquptzzq
2020-10-15 19:05:37 +08:00
@a719114136 所有支付方式都失败时不需要回滚吗?难道是继续往前走,把订单状态改掉
sobigfish
2020-10-15 19:08:34 +08:00
@cquptzzq #2 失败状态就继续是等待付款啊,难道你还想删掉订单?
PopRain
2020-10-15 19:09:27 +08:00
内部的、简单的先用事务锁定(标记待核销状态),真正需要调用外部接口的完成再去更改状态,基本不会出现事务失败回滚;应该尽量避免回滚事务
opengps
2020-10-15 19:10:25 +08:00
虽然三个步骤,但是实际是三个独立的事物,第一个失败就调用第二个,逐个更换
没有嵌套啊
Jooooooooo
2020-10-15 19:11:32 +08:00
补偿最终一致

不会用事物搞这个的
opengps
2020-10-15 19:12:20 +08:00
所有涉及到钱的,先用分布式缓存锁屏蔽多余的操作验证,避免重复请求等因素造成重复扣费
cquptzzq
2020-10-15 19:16:32 +08:00
谢谢各位
hcx0
2020-10-15 19:46:51 +08:00
难道你觉得这是单数据库操作?
way2explore2
2020-10-16 06:47:01 +08:00
Sagas 了解一下!

https://theburningmonk.com/wp-content/uploads/2017/07/saga-lambda-002.png



完全不知道为什么你需要 数据库回滚?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/715350

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX