点击上方“Java面试题精选”,关注公众号

面试刷图,查缺补漏

>>号外:往期面试题,10篇为一个单位归置到本公众号菜单栏->面试题,有需要的欢迎翻阅。

一、概述

随着时间和业务的发展,数据库中表的数据量会越来越大,相应地,数据操作,增删改查的开销也会越来越大。因此,把其中一些大表进行拆分到多个数据库中的多张表中。

另一方面,在分库分表以后还需要保证分库分表的和主库的事务一致性。这片文章介绍一下:https://zhuanlan.zhihu.com/p/25933039

本篇文章是基于非事务消息的异步确保的方式来完成分库分表中的事务问题。

二、需要解决问题

2.1 原有事务

由于分库分表之后,新表在另外一个数据库中,如何保证主库和分库的事务性是必须要解决的问题。

解决办法:通过在主库中创建一个流水表,把操作数据库的逻辑映射为一条流水记录。当整个大事务执行完毕后(流水被插入到流水表),然后通过其他方式来执行这段流水,保证最终一致性。

2.2 流水

所谓流水,可以理解为一条事务消息

上面通过在数据库中创建一张流水表,使用一条流水记录代表一个业务处理逻辑,因此,一个流水一定是能最终正确执行的.因此,当把一段业务代码提取流水中必须要考虑到:

流水延迟处理性。流水不是实时处理的,而是用过流水执行器来异步执行的。因此,如果在原有逻辑中,需要特别注意后续流程对该流水是不是有实时依赖性(例如后续业务逻辑中会使用流水结果来做一些计算等)。

流水处理无序性。保证即使后生成的流水先执行,也不能出现问题。

流水最终成功性。对每条插入的流水,该条流水一定要保证能执行成功

因此,提取流水的时候:

流水处理越简单越好

流失处理依赖越少越好

提取的流水在该业务逻辑中无实时性依赖

2.3 流水处理器

流水处理器即要保证流水处理尽可能处理快,又能保证流水最终能执行成功。

设想一个场景:当出现某一条流水处理失败,如果流失执行器要等当前流水执行成功才继续往后执行,那么会影响后续流水的执行,更严重的是一直卡在当条记录,导致整个系统出现问题

因此,流水执行器中设置2个任务:

第一个任务,流水处理任务,已最快的速度执行流水,如果流水处理失败了,也不影响后面流水处理

第二个任务,流水校验任务,这个任务就是顺序检查流水记录,保证所有流水都执行成功,如果失败,进行重试,多次重试失败以后发出告警以让人工介入处理。

2.4 流水处理完成

因为流水表是放在原数据库中,而流水处理完成后是操作分库,如果分库操作完成去更新老表流水消息,那么又是夸库事务,如何保证流水状态的更新和分库也是在一个事务的?

解决办法是:在分库中创建一个流水表,当流失处理完成以后,不是去更新老表状态,而是插入分库流水表中、

这样做的好处:

一般会对流水做唯一索引,那么如果流水重复多次执行的时候,插入分库流水表的时候肯定由于唯一索引检测不通过,整个事务就会回滚(当然也可以在处理流水事前应该再做一下幂等性判断)

这样通过判断主库流水是否在分库中就能判断一条流水是否执行完毕

三、流水处理器基本框架

流水处理器其实不包含任何业务相关的处理逻辑,核心功能就是:

通知业务接入方何时处理什么样的流水

检验流水执行的成功

注:流水执行器并不知道该流水表示什么逻辑,具体需要业务系统去识别后去执行相对应业务逻辑。

3.1 流水执行任务

流水处理调度任务就是通过扫描待处理的流水,然后通知业务系统该执行哪一条流水。

示意图如下:

3.2 流水校验任务

流水校验任务就是要比较主库和分库中的流水记录,对执行未成功的流水通知业务系统进行重新处理,如果多次重试失败则发出告警。

流程示意图:

四、为什么不用事务消息

由于是既有项目进行改造(本人从事互联网金融,所以是绝对不容忍有任何消息丢失或者消息处理失败),不使用事务消息有1个原因

需要额外引入消息队列,增加系统的复杂度,而且也需要额外的逻辑保证和消息队列通讯失败的时候处理

其实1不算是主要原因,而是因为事务消息需要手动的commit和rollback(使用数据库不需要),那么问题来了,spring中事务是有传递性的,那我们事务消息何时提交又是个大问题,例如 A.a()本来就是一个事务, 但是另外一个事务B.b()中又调用了A.a() 那事务消息提交是放在A.a()还是B.b()中呢?

来源:www.cnblogs.com/lizo/p/8035036.html

最近五期

与其在网上拼命找题?不如马上关注我们~

mysql分库分表面试_【53期】面试官:谈一下数据库分库分表之后,你是如何解决事务问题?...相关推荐

  1. 计算机考研340分什么概念,考研340分什么概念_中国考研网官网入口

    考研340分什么概念_中国考研网官网入口由广东研究生考试网考试快讯栏目由提供,更多关于考研340分什么概念,中国考研网官网入口,广东研究生考试快讯的内容,请关注广东研究生考试频道/广东人事考试网! 从 ...

  2. mysql gis index 索引原理_从原理到优化,深入浅出数据库索引

    MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构. 数据库查询是数据库的最主要功能之一,我们都希望查询数据的速度能尽可能的快,因此数据库系统的设计者会从查询算法的 ...

  3. mysql 不知道这样的主机_求救!!连接本机数据库时出现不知道这样的主机

    我安装的是wamp,在打开www中的testmysql.php时,结果显示不知道这样的主机,急救........ 回复讨论(解决方案) 不要自己解释错误信息,因为你并不知道他的含义. 否则你也就不需要 ...

  4. c# wpf 面试_【远程面试】九强通信 | 九洲电器集团全资子公司

    成都IT内推圈成立于2016年,专注成都IT互联网领域的招聘与求职;覆盖精准IT人群10W+,通过内推圈推荐且已入职人数超过5000+,合作公司均系成都知名或靠谱公司.此公众号每天7:30AM准时推送 ...

  5. p2p mysql 数据的拆分 案例_浅析: P2P网贷系统数据库设计

    许多人对于P2P网贷系统的技术环境并不熟悉,导致不少运营商被开发商忽悠的情况屡见不鲜.今天我们就从数据库出发,给大家讲一讲有关P2P数据库技术的知识.首先,数据库架构的设计是开发一套P2P网贷系统的前 ...

  6. 猿辅导python面试_猿辅导面试经历—个人感受

    今天参加了猿辅导的二面,无数槽点,不知道是不是很多公司都是这样,但是我还是忍不住要逼逼叨. 6月10号,我向猿辅导投了简历,想做招聘邀约专员这个岗位,然后hr加了我的微信,要了一份简历之后通知我,12 ...

  7. 开发人员 面试_开发人员面试指南

    开发人员 面试 by Dave Smith 戴夫·史密斯(Dave Smith) 开发人员面试指南 (A developer's guide to interviewing) 备用标题:如何面试公司 ...

  8. mysql为什么不使用存储过程_题外话,为什么不用数据库的存储过程

    不建议使用存储过程的原因 其一: 各种数据库的存储过程语法相差很大,给将来的数据库移植带来很大的困难 其二: 不利于版本控制,代码无法Diff和回滚,多人编辑无法同步. 虽然数据库建模工具可以把脚本保 ...

  9. 【53期】面试官:谈一下数据库分库分表之后,你是如何解决事务问题?

    程序员的成长之路 互联网/程序员/技术/资料共享 关注 阅读本文大概需要 4 分钟. 来自:www.cnblogs.com/lizo/p/8035036.html 一.概述 随着时间和业务的发展,数据 ...

最新文章

  1. java万年历计算法定节假日,java获取中国节假日
  2. golang中的接口
  3. java8 垃圾收集_面试官:怎么做JDK8的垃圾收集器的调优(面试常问)
  4. 2021-11-28
  5. vue打包后图片路径错误
  6. oracle varchar2改成大字段类型clob,读取大字段内容
  7. 给Chrome和Firefox添加js脚本作为插件的方法
  8. 机器学习系列(8)_回归算法,支持向量机
  9. matlab中Rip是什么意思,rip什么意思
  10. 如何在Linux杀死进程的名字?
  11. MATLAB强化学习实战(十二) 创建自定义强化学习算法的智能体
  12. Bootstrap 响应式布局模板
  13. 已经快失传的面诊、舌诊宝典,终于找齐了(建议收藏)
  14. 学技术总是很慢,你得培养这些个技巧!
  15. Android drawable 图片文件夹 缩放问题
  16. R语言-爬虫rvest
  17. 基于springboot的音乐网站的设计与实现(带论文)
  18. MongoDB Plugin(十一)
  19. 总监和总监不一样,看管理人数
  20. 强强联合 极智嘉助力Rhenus部署亚洲首个AMR智能仓

热门文章

  1. 用委托来实现IEqualityComparer接口
  2. sdk开发包如何使用_SDK如何使能行业?华为昇腾要用软件充分释放硬件性能
  3. 编写有效用例电子版_剖析用例设计方法的使用
  4. unity隔一段时间再显示_Unity3D内置倒计时!从此再不拖延!
  5. python制作收费标准_在Python中做一次简单定制1
  6. 苹果验证电子邮件地址服务器错误,苹果7P账户申请,验证电子邮件地址创建新Apple ID发生未知错误...
  7. k1658停运_最新通知!福州这些列车停运!
  8. 新萝卜家园win11全新专业版64位系统v2021.07
  9. 爱奇艺如何设置最小化显示在托盘
  10. Win7系统防火墙设置方法