NutzCN Logo
问答 队列设计问题?解决分布式事务的
发布于 3055天前 作者 herexu 2119 次浏览 复制 上一个帖子 下一个帖子
标签:

支付宝订单支付,如PC端与手机端同时对一订单支付,要如何设计,避免重复支付或者避免支付导致金额错误
总的来讲就是多端登录的问题要怎么设计,应该是叫分布事务的问题,队列要如何设计

12 回复

支付宝不允许对同一个账单付费2次的...

@wendal 是的,就是要如何避免支付两次
我说假如,假如说,手机和电脑同时点击付款,因为是两个事务,如果没有处理就会出现重复支付的问题吧

如果只是一个数据库, 那么只需要获取下面语句的总更新条数,就能知道当前操作是否有效

update xx set xxx =true, version=version+1 where version=oldVersion;

@wendal 是只有一个数据库,这句是什么意思,第一见哈
获取更新总条数之后,就能知道当前操作是否有效是什么意思

mysql: 如果两个线程执行上面的SQL, 那么,只有其中一个update会成功更新该记录.

  1. 线程1: oldVersion=100, update成功条数1, 所以version=101
  2. 线程2: oldVersion=100, update成功条数0,因为version变了,不匹配了.

@wendal 看不明白了哈,oldVersion是关键字吗?还是说你数据库字段

@wendal 还有假如是多表关联更新,那要怎么处理

和 JTA 没有半毛钱关系

@kerbores 可能我没描述清楚,只是看起来有点类似,因为PC系统和手机系统是分开的两个项目

分布式事务一般指的是一个事务中对多个数据源进行了操作,而不是多个操作可能影响同一记录的同一状态,如果 pc 和手机端在一个项目里面那就是个线程安全问题,如果不在一个项目里面就是兽总说的使用类似版本号的方式来解决的一个状态维护问题
1. A 发起支付请求
2. 判断当前订单是否已经支付
3.如果已经支付,直接返回
4.执行支付操作

1.A,B 同时发起支付请求
2.进入如上逻辑
3.在第二步只有一个能真正执行成功,不管 A 成功还是 B 成功,另外一个一定支付失败
4.那么不存在重复支付的情况

@kerbores 嗯,就是这个问题,线程安全问题,我想过两个方案,
一个如你所说,订单锁,就是每个订单的去做,
还有一个是用队列的形式去处理,队列也是别人告诉我的,有这么一种处理方式
我现在比较疑惑的是队列要怎么设计比较好,因为订单的方式比较麻烦,如果要每个接口的控制就很累得感觉

@kerbores 大哥,在吗?出来讨论一下哈

添加回复
请先登陆
回到顶部