分布式事物解决方案

本人菜鸟一枚,以下是个人解决详细分析和方案,希望大牛们指点不足或者存在的问题,万分感谢!

此方案达到的效果:数据最终一致性(允许实时查询多表数据),数据不丢失。

一:分布式事物场景
在用户下单的时候,会执行俩步骤: A:生成订单 B: 库存扣减 A 和B不在同一个库中,当代码Bug或者服务器环境问题,网络等问题,就可能出现以下异常情况:
1:可能A执行成功,B执行失败
2:B 执行成功, A执行失败()(使用线程池分别执行订单和库存操作,可能存在B成功,A失败)
3:AB多失败
很多人可能的解决方案是直接在try{}catch{} 进行回滚,回滚可能出现的问题:
1:数据丢失,有些公司是不允许的,这样订单就会少很多
2:服务器,程序bug, 网络环境问题等奇葩问题,可能偶尔会发生

   3: 回滚失败 

二:解决实现详细方案(Rabbitmq + redision + 任务调度)
1:在事物库创建tb_transcation 核心字段 (id, body, status, mq_consume_status, mq_send_status, cause, result)
2 : 在A库(订单库) 创建tb_order_transcation(id, order_id, transcation_id, body, status)
3: 在B库(库存库)创建tb_stock_transcation(库存日志表也可以称事物表)(id, stock_id, transcation_id, body, status)(这种表的作用:防止多个用户同时修改同一个数据,如果不存这个记录,那么如果有一个用户操作失败,那么库存数就会存在问题,这里要注意排序问题)
4:生产端处理:

    1:  封装前会效验库存和订单信息,封装主事物表body数据(body = orderdata + stockData),status(此时是待执行阶段), 将这个事物po存入事物表

    2:发送MQ 消息,消息主体为transcationId, 这样消息小,节省空间,传输性能快。

5:消费端处理:

    1:执行生成订单操作(生成订单接口执行订单事物保存操作, 这个必须在同一个服务里面,同一个库,这样可以通过Spring进行错误回滚,不会导致生成订单成功,而订单事物保存失败,可以达到一致性)

    2:执行扣除库存操作(库存接口执行库存事物保存操作)

    3:如果1,2步执行成功,name更改tb_transcation的状态(更改成功,结束操作)

    4:如果1,2,3步其中一步执行出错,那么try{} catch 里面 更改tb_transcation的状态(执行失败状态),如果更改出错,那么重试3次(可以设置),重试需要查询多个表的事物状态(tb_order_transcation和tb_stock_transcation)状态,如果状态多正常,那么只需要更改事物状态,否则重新执行第1或者2步(如果N次重试还是失败,那么不是代码问题,或者就是服务器问题, 那么丢弃这个MQ, 后台开发一个事物列表查看失败原因,可以提供按钮执行,达到数据最终一致性,或者通过分布式定时器程序达到最终一致性)

    注意:生成订单和库存的时候可能会造成重复数据,如果存在多个消费者的话,如果多个获取到tb_order_transcation的状态多是失败状态,那么就会重复生成订单,虽然id会冲突,生成不了,这样打印很多错误日志。而且如果是库存扣减的话,这样库存就会出现问题,所以这里最好加分布式锁防止并发问题
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,492评论 6 513
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,048评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,927评论 0 358
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,293评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,309评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,024评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,638评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,546评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,073评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,188评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,321评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,998评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,678评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,186评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,303评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,663评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,330评论 2 358

推荐阅读更多精彩内容