咱们须要接受失望,由于它是有限的;咱们不会失去但愿,由于它是无穷的。spring
随着时间和业务的发展,数据库中表的数据量会愈来愈大,相应地,数据操做,增删改查的开销也会愈来愈大。所以,把其中一些大表进行拆分到多个数据库中的多张表中。
本篇文章是基于非事务消息的异步确保的方式来完成分库分表中的事务问题。数据库
因为分库分表以后,新表在另一个数据库中,如何保证主库和分库的事务性是必需要解决的问题。微信
解决办法:经过在主库中建立一个流水表,把操做数据库的逻辑映射为一条流水记录。当整个大事务执行完毕后(流水被插入到流水表),而后经过其余方式来执行这段流水,保证最终一致性。框架
所谓流水,能够理解为一条事务消息异步
上面经过在数据库中建立一张流水表,使用一条流水记录表明一个业务处理逻辑,所以,一个流水必定是能最终正确执行的.所以,当把一段业务代码提取流水中必需要考虑到:spa
所以,提取流水的时候:blog
由于流水表是放在原数据库中,而流水处理完成后是操做分库,若是分库操做完成去更新老表流水消息,那么又是夸库事务,如何保证流水状态的更新和分库也是在一个事务的?索引
解决办法是:在分库中建立一个流水表,当流失处理完成之后,不是去更新老表状态,而是插入分库流水表中、队列
这样作的好处:图片
流水处理器其实不包含任何业务相关的处理逻辑,核心功能就是:
注:流水执行器并不知道该流水表示什么逻辑,具体须要业务系统去识别后去执行相对应业务逻辑。
流水处理调度任务就是经过扫描待处理的流水,而后通知业务系统该执行哪一条流水。
示意图以下:
流水校验任务就是要比较主库和分库中的流水记录,对执行未成功的流水通知业务系统进行从新处理,若是屡次重试失败则发出告警。
流程示意图:
因为是既有项目(互联网金融,因此是绝对不容忍有任何消息丢失或者消息处理失败)进行改造,不使用事务消息有1个缘由