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

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

面试刷图,查缺补漏

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

一、概述

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

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

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

二、需要解决问题

2.1 原有事务

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

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

68bfdf3476ef0c6acd06a67b23f67ce1.gif

2.2 流水

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

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

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

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

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

因此,提取流水的时候:

流水处理越简单越好

流失处理依赖越少越好

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

2.3 流水处理器

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

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

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

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

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

68bfdf3476ef0c6acd06a67b23f67ce1.gif

2.4 流水处理完成

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

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

这样做的好处:

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

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

68bfdf3476ef0c6acd06a67b23f67ce1.gif

三、流水处理器基本框架

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

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

检验流水执行的成功

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

68bfdf3476ef0c6acd06a67b23f67ce1.gif

3.1 流水执行任务

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

示意图如下:

68bfdf3476ef0c6acd06a67b23f67ce1.gif

3.2 流水校验任务

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

流程示意图:

68bfdf3476ef0c6acd06a67b23f67ce1.gif

四、为什么不用事务消息

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

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

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

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

最近五期

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

68bfdf3476ef0c6acd06a67b23f67ce1.gif

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/561576.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pandas python groupby_python – 如何使用pandas groupby汇总多个列?

我有一个看起来像的数据框day type col d_1 d_2 d_3 d_4 d_5...1 A 1 1 0 1 01 A 2 1 0 1 02 B 1 1 1 0 0也就是说,我有一个普通的列(col)和许多以d_为前缀的列我需要按日执行groupby并键入,我想计算每个日期类型组合的每个d_列中的值的总和.我还需要在我的数据中的其他列上执行…

圆管当量直径_截面相同时,正方型截面的当量直径大于圆管直径。( )。

“党在过渡时期的总路线的实质,截面就是使生产资料的社会主义公有制成为我们国家和社会的( )的经济基础。”根据小儿尿道特点,相同型截易患的疾病为正方直径直径泌尿系感染的致病菌最为常见的是当量大于汽车离合器踏板自由行程过小或没有行程, 将会引起(…

h710阵列卡支持最大硬盘_DELL服务器RAID磁盘阵列在线扩容(以H710P阵列卡为例)

DELL服务器RAID磁盘阵列在线扩容(以H710P阵列卡为例)分享到:作者来源: 未知 发布时间:2013-01-12简介我们可通过扩充容量和 / 或改变 RAID 级别的方式来重新配置联机虚拟磁盘。注: 跨接式虚拟磁盘 (如 RAID 10、 50 和 60)无法重新配置…

linuxpgrepgrep_linux命令:ps pstree pgrep pidof进程管理

ps命令简介:此个命令用于查看用户进程。1.命令格式:ps [option] : ps 参数常用的使用格式:ps aux |grep keyword 通过关键字查找相关的进程信息[rootxuelinux ~]# ps aux 显示所有进程的信息USER PID %CPU %MEM …

bash shell sed 获取第一行_老司机给出的关于 shell 脚本的8个建议,必收!

这八个建议,来源于键者几年来编写 shell 脚本的一些经验和教训。事实上开始写的时候还不止这几条,后来思索再三,去掉几条无关痛痒的,最后剩下八条。毫不夸张地说,每条都是精挑细选的,虽然有几点算是老生常谈…

springmvc与mysql实例_Spring+Mybatis+SpringMVC+Maven+MySql搭建实例

摘要:本文主要讲了如何使用Maven来搭建SpringMybatisSpringMVCMySql的搭建实例,文章写得很详细,有代码有图片,最后也带有运行的效果。一、准备工作1. 首先创建一个表:CREATE TABLE t_user (USER_ID int(11) NOT NULL A…

python常规异常的基类_Python警告的基类警告类是____。

【判断题】pickle使用pickle.dump(data,file)读取数据。【单选题】下列是Python断言语句失败的错误类型是?【单选题】立体被平面截切所产生的表面交线称为( )。【判断题】在Python的异常处理中,可以人为的设置某种错误类型【单选题】单片机实质上是一个【单选题】确认密码的限…

磁力mysql搜索_多功能搜索 搜索系统安装 小说 电影 磁力

环境:2h4g 60ssd一、首先安装宝塔面板yum install -y wget && wget -O install.sh http://download.bt.cn/install/install.sh && sh install.sh安装环境采用 nginx php7 mysql5.5二、关闭centos下的防火墙CentOS 6.5关闭防火墙servcie iptables st…

ES迁mysql_使用kafka连接器迁移mysql数据到ElasticSearch

概述把 mysql 的数据迁移到 es 有很多方式,比如直接用 es 官方推荐的 logstash 工具,或者监听 mysql 的 binlog 进行同步,可以结合一些开源的工具比如阿里的 canal。这里打算详细介绍另一个也是不错的同步方案,这个方案基于 kafka…

mysql not exists很慢_查询速度优化用not EXISTS 代替 not in

exists : 强调的是是否返回结果集,不要求知道返回什么, 比如:select name from student where sex m and mark exists(select 1 from grade where ...) ,只要exists引导的子句有结果集返回,那么exists这个条件就算成立了,大家注意返回的字段…

python自定义函数func_python自定义函数与面向对象

前言python的最大特点就是dynamically typed就是动态类型,不像java需要定义数据类型引入先从一段代码引入:12345678910class Dog():def __init__(self,name,age):self.namenameself.ageagedef getName(self):return self.namedogDog(name,16)print(dog.g…

java的继承实例_java继承(实例讲解一)

Java继承(Java inheritance)Java继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类。这种技术使得复用以前的代码非常容易,能够大大缩短开发周…

java 调用groovy_Java调用Groovy脚本

在idea下,标准的Java maven项目中展示如何调用Groovy脚本和方法。maven项目引进Groovy libFile -> Project Structure -> Global Libaries 添加下载好的Groovy下lib里面的jar包调用Groovy脚本首先,Java调用Groovy脚本需要该Groovy脚本里面有个main…

java struts 框架_java中struts 框架的实现

该文章主要简单粗暴的实现了struts的请求转发功能。 其他的功能后续会慢慢补上。最近在学习javassist的内容,看到一篇文章 大家一起写mvc 主要简单的描述了mvc的工作流程,同时实现了简单的struts2功能。这里仿照的写了个简单的struts2框架,…

memcached 使用 java_使用Java java_memcached client的陷阱

这2天,才发现之前我们的某个开发人员使用java_memcached-release_2.0.1.jar是有问题的在我们的某个模块里,需要2个memcached,分别提供不同的服务于是,开发的人员就从网上粘贴来如下的码,分别生成2个MemcacheUtil类stat…

java final 变量只读_java final的使用总结

final 变量:是只读的;final 方法:是不能继承或者重写的。final 引用:引用不能修改,但是对象本身的属性可以修改;final class:不可继承;final MyObject o new MyObject();o.setValue…

java list 获取索引_java – 获取arrayList中元素的索引

我试图在arrayList minuteList中获得466的索引[288, 318, 346, 376, 406, 436, 466, 1006, 1036, 1066, 1096, 1126, 1156]但我收到这个错误:java.lang.IndexOutOfBoundsException: Index: 466, Size: 13at java.util.ArrayList.rangeCheck(ArrayList.java:635)at j…

java 如何调用static_java 关键字static详细介绍及如何使用

java 关键字static 详解一、 static代表着什么在Java中并不存在全局变量的概念,但是我们可以通过static来实现一个“伪全局”的概念,在Java中static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,当然也可以修饰代码…

java xml setdoctype_如何在Java中使用DOM将自定义doctype标记添加到带有xhtml标记的xml中?...

我使用java中的DOM创建了一个XML文档,并将XHTML标记插入到XML文档中。现在我要添加如下doctype:]>我试着把它作为一个字符串追加,但没有成功。DocumentBuilderFactory docFactory DocumentBuilderFactory.newInstance();docFactory.setNamespaceAware(true);DocumentBuilde…

java 实验报告模板_java实验报告模板

java实验报告模板1 / 26java 实验报告模板河南工业大学实验报告课程 Java 程序设计 _ 实验名称 一、Java 程序流程控制 院 系____ ____ 专业班级__ _________ 姓 名_______________ 学 号____________ _ 指导老师: 日 期一.实验目的熟悉 Java 语言中的数据类型、变量…