面试必问:谈一下数据库分库分表之后,你是如何解决事务问题?

157 篇文章 1 订阅

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

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

需要解决的问题

原有事务

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

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

流水

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

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

  • 流水延迟处理性。流水不是实时处理的,而是用过流水执行器来异步执行的。因此,如果在原有逻辑中,需要特别注意后续流程对该流水是不是有实时依赖性(例如后续业务逻辑中会使用流水结果来做一些计算等)。
  • 流水处理无序性。保证即使后生成的流水先执行,也不能出现问题。
  • 流水最终成功性。对每条插入的流水,该条流水一定要保证能执行成功。

因此,提取流水的时候:

  • 流水处理越简单越好
  • 流水处理依赖越少越好
  • 提取的流水在该业务逻辑中无实时性依赖

流水处理器

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

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

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

  • 第一个任务,流水处理任务,以最快的速度执行流水,如果流水处理失败了,也不影响后面流水处理。
  • 第二个任务,流水校验任务,这个任务就是顺序检查流水记录,保证所有流水都执行成功,如果失败,进行重试,多次重试失败以后发出告警以让人工介入处理。

流水处理完成

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

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

这样做的好处:

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

流水处理器基本框架

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

  • 通知业务接入方何时处理什么样的流水
  • 检验流水执行的成功

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

流水执行任务

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

示意图如下:

流水校验任务

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

流程示意图:

为什么不用事务消息

由于是既有项目进行改造,不使用事务消息有以下原因:

  • ① 需要额外引入消息队列,增加系统的复杂度,而且也需要额外的逻辑保证和消息队列通讯失败的时候处理
  • ② 其实①不算是主要原因,而是因为事务消息需要手动的commit和rollback(使用数据库不需要),那么问题来了,spring中事务是有传递性的,那我们事务消息何时提交又是个大问题,例如 A.a()本来就是一个事务, 但是另外一个事务B.b()中又调用了A.a() 那事务消息提交是放在A.a()还是B.b()中呢?

 为帮助开发者们提升面试技能、有机会入职BATJ等大厂公司,特别制作了这个专辑——这一次整体放出。

大致内容包括了: Java 集合、JVM、多线程、并发编程、设计模式、Spring全家桶、Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、MongoDB、Redis、MySQL、RabbitMQ、Kafka、Linux、Netty、Tomcat等大厂面试题等、等技术栈! 

需要获取以下这些面试题答案以及学习资料得话麻烦关注+好评之后

直接点击此链接→【点我直接获取】  即可免费获取哦~~

ÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÂ¥ÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃèÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃèÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÿÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃéÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃæÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÂ¥ÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÂ¥ÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÂ¥ÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃþÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃçÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃæÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃèÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÿÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃð


看完三件事❤️

  • 如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙:
  • 点赞,转发,有你们的 『点赞和评论』,才是我创造的动力。
  • 关注作者公众号 『 java烂猪皮 』,不定期分享原创知识。
  • 关注后回复【666】扫码即可获取学习资料包。
  • 同时可以期待后续文章ing🚀。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
面试高级开发的期间整理的面试题目,记录我面试遇到过的数据库题目以及答案,比如说mvvc还有数据库调优,索引。 目录如下 数据库 数据库事务隔离级别; 事务的并发导致的问题; 数据库事务设置不同的隔离级别会导致的不同并发问题 当前读和快照读的意义; mvcc:多版本控制: 指的是一种提高并发的技术,其解决问题是什么; MVCC实现过程; mvcc三大组件; RC、RR级别下的InnoDB快照读有什么不同:17 mysql面试题01.vep 描述一下mysql的乐观锁和悲观锁,以及mysql锁的种类; mysql如何做分库分表的; mysql描述一下mysql主从复制的机制的原理;mysql主从复制主要有几种模式 在mysql开启Binlog(为了其他非事务引擎复制所以引入binlog,比如说主从)后,如何保证binlog和InnoDB redo日志的一致性呢; binlog和redo log和区别; mysql涉及到的log有哪些; 阿里要求尽量少用join,为什么; 索引 索引分类 索引的数据结构; b树和b+树的区别 索引失效的情况: 数据库优化 查询计划的结果中看哪些关键数据; mysql 如何调优; 索引是建的越多越好吗; 在表查询中,一律不要使用 * 作为查询的字段列表,原因是什么; 描述一下InnoDB和MyISAM的区别; 当前读和快照读的意义; 13 mvcc:多版本控制: 指的是一种提高并发的技术,其解决问题是什么; 14 MVCC实现过程; 14 mvcc三大组件; 15 RC、RR级别下的InnoDB快照读有什么不同:17 mysql面试题01.vep 17 描述一下mysql的乐观锁和悲观锁,以及mysql锁的种类; 17 mysql如何做分库分表的; 18 mysql描述一下mysql主从复制的机制的原理;mysql主从复制主要有几种模式 19 在mysql开启Binlog(为了其他非事务引擎复制所以引入binlog,比如说主从)后,如何保证binlog和InnoDB redo日志的一致性呢; 20 binlog和redo log和区别; 22 mysql涉及到的log有哪些; 23 阿里要求尽量少用join,为什么; 23 索引 24 索引分类 24 索引的数据结构; 24 b树和b+树的区别 26 索引失效的情况: 26 数据库优化 27 查询计划的结果中看哪些关键数据; 27 mysql 如何调优; 27 索引是建的越多越好吗; 29 在表查询中,一律不要使用 * 作为查询的字段列表,原因是什么; 29 描述一下InnoDB和MyISAM的区别; 29
分库分表是一种常用的数据库优化手段,特别适用于数据量大且并发访问高的场景。以下是关于MySQL分库分表的一些面试题: 1. 请问什么是分库分表分库分表是指将一个大型数据库分成多个小的数据库,再将每个小的数据库进行水平或垂直切分,从而达到提高数据库性能和扩展能力的目的。 2. 为什么需要进行分库分表分库分表可以解决数据库在高并发情况下的性能瓶颈问题,提高数据库的读写能力和负载均衡能力。同时,它还可以解决单表数据量过大导致查询效率低下的问题。 3. 分库分表的常用策略有哪些? 常见的分库分表策略包括水平分表和垂直分表。水平分表是指将一个表的行数据按照某种规则分散到多个表中,例如按照用户ID或时间进行分表;垂直分表是指将一个表按照列的属性划分到多个表中,例如将经常被查询的列和不常被查询的列分成两个表。 4. 分库分表的中间件有哪些? 在实际应用中,常常使用分库分表中间件来简化分库分表的操作。常见的分库分表中间件有Mycat和sharding-jdbc等。 5. 分库分表可能会带来哪些问题分库分表可能会对事务处理、跨节点Join操作和分布式事务等方面带来一些挑战。需要注意解决这些问题,以保证分库分表的正确性和稳定性。 以上是关于MySQL分库分表的一些面试题目,希望能对你有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值