前言
随着现在互联网的普及使得互联网用户大幅增加,传统的单体架构将不能支撑大量的用户,因此开始拆分为多个服务,最初的拆分粒度比较粗,这种架构叫SOA架构,目前我所在的公司就是一个基于SOA架构的传统软件公司,我负责的就是SOA架构中的一个系统,SOA不同于微服务,微服务的拆分粒度更细一些,比如我所在的系统如果按照微服务来拆分还可以继续拆分成比如订单服务、短信服务、支付服务等等。谈到事务,就以为我所在的系统为例,随着业务的发展,单库已经不能支撑系统的运行,于是拆分成了历史库和当前库,单表拆分成了月表或者按照用户取模的用户分表,这样系统在操作过程中不免会涉及到两个库同时操作的情况。虽然框架以及业务已经在极力的避免这种跨库操作,但是需求的多样化,导致这种情况还是会有的,那么如何保证一次业务同时操作两个数据库中的表时,事务可以保持一致?
跨库事务
以上所述产生的问题,即为跨库事务,今天通过学习了解到了一个跨库事务的解决方式,采用JTA来解决跨库事务。
什么时JTA
以下是百度百科的解释:
Java事务API(JTA:Java Transaction API)和它的同胞Java事务服务(JTS:Java Transaction Service),为J2EE平台提供了[分布式事务]服务(distributed transaction)。
一个分布式事务(distributed transaction)包括一个事务管理器(transaction manager)和一个或多个[资源管理器](resource manager)。
一个资源管理器(resource manager)是任意类型的持久化数据存储。
事务管理器(transaction manager)承担着所有事务参与单元者的相互通讯的责任。
什么是XA协议
XA是一种两阶段提交协议,常用到的数据库都遵循该协议,它通过协调访问多个关系数据库的单个事务来确保数据完整性,两阶段提交是指将提交分为两个部分一部分是准备阶段,另一部分才是真正的提交,比如同一笔业务涉及两个数据库,那么准备阶段就是第一个数据库告诉事务管理器说“我准备好了,可以提交”,另一个数据库也说“我准备好了,可以提交”,这时事务管理器采用执行真正的提交,如果有一方没有准备好那就都不提交。
java中的实现方式
目前java中常用的JTA资源管理器有atomikos、jotm
开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第23天,点击查看活动详情