分布式事务,seata企业级解决方案
一.事务相关介绍:
1.1简单理解:事务可以理解为要么把事情都做完,要么都不做,不能只做一半。
对于一个分布式计算系统来说,不可能同时满足以下三点:
- 一致性(Consistency) (等同于所有节点访问同一份最新的数据副本)
- 可用性(Availability)(每次请求都能获取到非错的响应——但是不保证获取的数据为最新数据)
- 分区容错性(Partition tolerance)(以实际效果而言,分区相当于对通信的时限要求。系统如果不能在时限内达成数据一致性,就意味着发生了分区的情况,必须就当前操作在C和A之间做出选择。)
大部分情况下分布式事务更多保证可用性,互联网应用一般对用户体验,响应速度,并发性都有高要求,通常不会采用强一致性,而是选择保证最终一致性
二.分布式事务的一些原理介绍
J2EE容器:Weblogic JBoss可作为JTA承载者 。没有tomcat,因为tomcat需要另外增加插件。
容器作为协调者,此方案下实现事务需要两个阶段准备阶段、提交阶段(准备阶段 提交阶段 回滚阶段)。各模块服务向协调容器发送准备完成信号,所有服务准备发好,容器向个服务发送提交命令。过程出中问题就回滚。
JTA的J2EE的标准模块,额外消耗小。JTA适合传统管理类系统的改造
三.分布式事解决方案Alibaba Seata
http://seata.io/zh-cn/index.html seata官网可了解更多详情
简单看一下回滚日志示例,能更好的帮助理解,日志中记录的是数据库修改前和修改后的数据,回滚时自动按照日志执行回退操作。
要使用seata需要完三部分的安装、配置,分别是安装TC,配置RM,配置TM
2.在conf文件夹对file.conf 和 registry.conf进行配置
registry.conf部分表示注册相关,config表示系统配置相关。示例中注册选择为eureka,系统配置使用默认根据file.conf配置
type表示使用eureka微服务模式,配置对应的地址和application
vgroup_mapping.my_test_tx_group = "default"
default.grouplist = "127.0.0.1:8091" (第二个参数的前缀default,根据第一个参数的value来定)
2.每个业务数据库都需要undo log表,到seata官网的快速启动 菜单中查找建表语句
<!--这个依赖是springcloud和seata的整合包,2.1.1整合包使用的是0.7的seata-->
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-seata</artifactId>
<version>2.1.0.RELEASE</version>
<artifactId>seata-all</artifactId>
<!--这个依赖是真正的seata,手动换成1.0.0版本-->
<artifactId>seata-all</artifactId>
4..注册文件配置(和第一步一样,就是把文件复制一份放到项目的resource文件夹下)
5.配置文件配置(和第一步一样,就是把文件复制一份放到项目的resource文件夹下)
7.1创建DataSourceProxy,扩展数据源功能,增加执行回滚日志功能
7.3调整数据库连接配置sqlSessionFactory使用代理数据源创建数据库连接
7.4排除springboot自带的数据库连接池,在启动类上修改@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
写操作时获取全局锁。为什么不用表锁,锁住对应的操作表呢?因为也要将undo表锁住,不然出现多个同一操作的回滚日志无法准确回滚。
读操作的时候其他程序可以修改该数据,如果需要读取强一致性,在查询的sql语句加 select for update