ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

分布式事务相关

2022-02-10 23:33:55  阅读:157  来源: 互联网

标签:insert 事务 重试 token 使用 相关 分布式


分布式事务问题

背景

  • 积分支付,需要查询用户积分;
  • 商品扣减库存;
  • 保存订单;

这些一定要保证一致性;

解决办法有

  • 基于XA协议的两阶段提交
  • 事务补偿机制
  • 本地消息表+定时任务
  • MQ

XA协议

一个事务管理器和多个资源管理器组成

提交分为两阶段

  • prepare
  • commit

第一阶段

https://www.icode9.com/i/l/?n=20&i=blog/3327/202103/3327-20210328134525770-628211280.png

 

 

 

 第二阶段

https://www.icode9.com/i/l/?n=20&i=blog/3327/202103/3327-20210328134715095-1131354898.png

这个需要事务管理器给所有RM发送准备指令和执行指令,效率特别低。

DEMO:

MySql5.7支持XA,尽量使用8.0版本

Mysql连接器,Mysql Connector/J 5.0以上支持

Atomikos做分布式事务,管理分布式数据库

分库分表的组件:MyCat和Sharding-JDBC这两个都已经集成Atomikos了,直接使用就可以。

 

事务补偿机制

我们现在用的这个,分布式事务处理,就是事务补偿机制的原理。嗯,这个存在的问题就是有可能A扣减了,B也扣减了,但是B扣钱失败了。然后此时A回滚的时候会有问题,嗯,这是一个待解决的一块儿。

在catch里写回滚逻辑。涉及到重试,这块有一些复杂,具体怎么处理才能尽可能一致?

 

本地消息表+定时任务

这个就是落一个表,定时任务扫表处理

 

 

基于MQ

 

 

不同公司之间,因为机房不一致,就无法使用MQ来达到消息一致性,可以使用本地消息表,推送信息去处理,例如对接支付宝微信。

消息的重试

rocketmq有messageExt.getReconsumeTimes()可以记录重试次数,可以达到一定次数后进行consume,然后报警,人工处理。

 

幂等

怎么防止重复下单

 

表单怎么防止重复提交

 

接口重复调用,重试,怎么幂等

UPDATE时,使用乐观锁

insert使用版本号,可以是token

混合操作,可以使用分布式锁来锁住业务单号,如果没有业务单号,也是可以用token

 

 UPDATE幂等

列表更新时,可以使用数据的version来做乐观锁,加上数据库的行锁来保证。

 

insert幂等

有唯一业务号的insert操作,例如下单场景,商品id+用户id ,

分布式锁来保证幂等,保证接口幂等,

这个也可以作为一个唯一索引到数据库,

业务执行后,不进行锁的释放,过期自动释放。

 

没有这种唯一业务号的就用token作为key来获取分布式锁。

 

标签:insert,事务,重试,token,使用,相关,分布式
来源: https://www.cnblogs.com/jiangym/p/15881521.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有