前言
事务是保证数据一致性,准确性的重要保证。以spring举例,在单体项目中常用的是注解式事务,例如在service方法上添加 @Transactional(rollbackFor = Exception.class) 注解即可。而当我们业务复杂,数据量大时候,我们就不得不拆分服务,当拆分服务后,每个功能模块都是一个独立运行的服务,这时候我们又该如何处理事务呢?如何保证服务与服务之间的数据一致性呢?
何为数据库事务
数据库事务(Database Transaction)是指作为单个逻辑工作单元执行的一组数据库操作,这些操作要么全部成功完成并永久保存,要么全部失败并回滚到最初状态,以确保数据库的一致性和完整性。
事务具有以下四个特性,通常缩写为 ACID:
- 原子性(Atomicity):事务被视为不可分割的工作单元,要么全部执行成功,要么全部失败回滚。如果事务中的任何一部分操作失败,整个事务都会被回滚到初始状态。
- 一致性(Consistency):事务的执行将数据库从一致状态转移到另一个一致状态,即事务执行前后数据库的完整性约束没有被破坏。
- 隔离性(Isolation):多个事务并发执行时,每个事务的操作应该被隔离,互不干扰。这意味着一个事务的中间状态对其他事务是不可见的,直到事务提交。
- 持久性(Durability):一旦事务提交,其所做的修改将永久保存在数据库中,并不会因为系统故障或其他因素而丢失。
通过事务,可以确保数据库操作的完整性和一致性,避免数据损坏或丢失。数据库管理系统使用事务来保证数据的可靠性,并提供回滚和提交操作来管理事务的执行。
何为分布式事务
分布式事务是指涉及多个独立数据库或应用程序之间的事务操作,这些数据库或应用程序分布在不同的计算机或服务器上。分布式事务需要确保跨多个节点的事务操作具有ACID属性,保证数据的一致性和完整性。
通俗来讲:就是把上面的单体事务连接成多个事务且保证一致。单个变多个,听着简单实际大有搞头。
何为Seata
Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。2023 年 10 月阿里和蚂蚁集团正式将 Seata 捐赠给 Apache 基金会。
部署Seata服务端
1、首先使用docker命令临时启动一个seata容器
1 | docker run -d -p 8091:8091 -p 7091:7091 --name seata-server-test seataio/seata-server:latest |
2、将此容器启动后内部的配置文件copy出来放到宿主机中,方便后面使用
1 | docker cp seata-server-test:/seata-server/resources /home/seata/data |
3、删除上面创建的临时容器
1 | docker rm -f seata-server-test |
4、创建docker-compose.yml。其中/seata-server/resources映射的目录就是第一步copy出来的目录
1 | version: "3.1" |
5、编辑seata的application.yml配置文件,路径为第2步copy出来的位置
1 | server: |
此配置文件的大致意思为:
- 使用nacos作为服务的注册中心
- 使用nacos作为服务配置中心
PS:因此需要先提前搭建好nacos服务
6、创建seata的配置文件并上传到nacos中
文件名称为:seataServer.properties
1 | db = |
7、创建seata库的表结构
1 | -- -------------------------------- The script used when storeMode is 'db' -------------------------------- |
8、启动seata服务
1 | docker-compose up -d |
自此Seata的服务端已经全部搭建完成,上面教程给出的是 nacos+db 方式部署。当然也可以选择无nacos、无db方式部署,更为简单但不那么稳定,可能会出现事务丢失情况。
具体配置相关可参考官方文档:https://seata.apache.org/zh-cn/docs/ops/deploy-by-docker-compose
配置Seata客户端
客户端就比较简单分为以下几点
1、服务端项目需要注册到nacos注册中心且和seata共用一个中心
2、引入seata的maven依赖
1 |
|
3、配置application.properties相关配置
1 | # 使用默认nacos组,注意和seata服务端配置保持一致 |
4、在需要使用分布式事务的地方加上注解 @GlobalTransactional
结言
至此分布式事务seata已经全部搭建完成。
详情实战可参考项目:https://github.com/Snykta/forge-fast-cloud (一个可快速开始的SpringCloud微服务脚手架)