数据库分库分表之后,如何解决事务问题?.docxVIP

数据库分库分表之后,如何解决事务问题?.docx

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
数据库分库分表之后,如何处理事务问题? 2021-07-08 一、概述 随着时间和业务的进展,数据库中表的数据量会越来越大,相应地,数据操作,增删改查的开销也会越来越大。因而,把其中一些大表进行拆分到多个数据库中的多张表中。 本篇文章是基于非事务消息的异步确保的方式来完成分库分表中的事务问题。 二、需要处理问题 2.1 原有事务 由于分库分表之后,新表在另外一个数据库中,如何保证主库和分库的事务性是必需要处理的问题。 处理方法:通过在主库中创建一个流水表,把操作数据库的规律映射为一条流水记录。当整个大事务执行完毕后(流水被插入到流水表),然后通过其他方式来执行这段流水,保证最终全都性。 2.2 流水 所谓流水,可以理解为一条事务消息 上面通过在数据库中创建一张流水表,使用一条流水记录代表一个业务处理规律,因而,一个流水肯定是能最终正确执行的.因而,当把一段业务代码提取流水中必需要考虑到: 流水延迟处理性。流水不是实时处理的,而是用过流水执行器来异步执行的。因而,假如在原有规律中,需要特殊留意后续流程对该流水是不是有实时依靠性(例如后续业务规律中会使用流水结果来做一些计算等)。 流水处理无序性。保证即便后生成的流水先执行,也不能消灭问题。 流水最终成功性。对每条插入的流水,该条流水肯定要保证能执行成功 因而,提取流水的时候: 流水处理越简约越好 流失处理依靠越少越好 提取的流水在该业务规律中无实时性依靠 2.3?流水处理完成 由于流水表是放在原数据库中,而流水处理完成后是操作分库,假如分库操作完成去更新老表流水消息,那么又是夸库事务,如何保证流水形态的更新和分库也是在一个事务的? 处理方法是:在分库中创建一个流水表,当流失处理完成以后,不是去更新老表形态,而是插入分库流水表中、 这样做的好处: 一般会对流水做独一索引,那么假如流水反复多次执行的时候,插入分库流水表的时候确定由于独一索引检测不通过,整个事务就会回滚(当然也可以在处理流水事前应当再做一下幂等性推断) 这样通过推断主库流水能否在分库中就能推断一条流水能否执行完毕 三、流水处理器基本框架 流水处理器其实不包含任何业务相关的处理规律,核心功能就是: 通知业务接入方何时处理什么样的流水 检验流水执行的成功 注:流水执行器并不晓得该流水表示什么规律,具体需要业务系统去识别后去执行相对应业务规律。 3.1 流水执行任务 流水处理调度任务就是通过扫描待处理的流水,然后通知业务系统该执行哪一条流水。 示意图如下: 3.2 流水校验任务 流水校验任务就是要比较主库和分库中的流水记录,对执行未成功的流水通知业务系统进行重新处理,假如多次重试失败则发出告警。 流程示意图: 四、为什么不用事务消息 由于是既有项目(互联网金融,所以是确定不容忍有任何消息丢失或者消息处理失败)进行改造,不使用事务消息有1个缘由 需要额外引入消息队列,添加系统的简单度,而且也需要额外的规律保证和消息队列通讯失败的时候处理 其实1不算是次要缘由,而是由于事务消息需要手动的commit和rollback(使用数据库不需要),那么问题来了,spring中事务是有传递性的,那我们事务消息何时提交又是个大问题,例如 A.a()原来就是一个事务, 但是另外一个事务B.b()中又调用了A.a() 那事务消息提交是放在A.a()还是B.b()中呢?

文档评论(0)

liuxiyuliuxingyu + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档