跳到主要内容

Spring Cloud Alibaba 之 Seata分布式事务服务;AT事务模式(二十)

AT 模式

Seata AT 模式

前提

1、 基于支持本地ACID事务的关系型数据库;

2、 Java应用,通过JDBC访问数据库;

整体机制

两阶段提交协议的演变:

1、 一阶段:业务数据和回滚日志记录在同一个本地事务中提交,释放本地锁和连接资源;

2、 二阶段:;

(1)提交异步化,非常快速地完成

(2)回滚通过一阶段的回滚日志进行反向补偿

写隔离

1、 一阶段本地事务提交前,需要确保先拿到全局锁

2、 拿不到全局锁,不能提交本地事务;

3、全局锁的尝试被限制在一定范围内,超出范围将放弃,并回滚本地事务,释放本地锁;

读隔离

在数据库本地事务隔离级别 读已提交(Read Committed) 或以上的基础上,Seata(AT 模式)的默认全局隔离级别是 读未提交(Read Uncommitted)

如果应用在特定场景下,必需要求全局的 读已提交 ,目前 Seata 的方式是通过 SELECT FOR UPDATE 语句的代理。

一、AT事务模式:SpringBoot单体应用多数据源AT分布式事务

 

在Spring Boot单体项目中,使用了多数据源,就要保证多个数据源的数据一致性,即产生了分布式事务的问题,采用Seata的AT事务模式来解决该分布式事务问题

以下图购物下单为例

 

1、创建数据库、表、插入数据等

(1)accountdb账户库、account账户表

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for account
-- ----------------------------
DROP TABLE IF EXISTS account;
CREATE TABLE account (
id int(20) NOT NULL AUTO_INCREMENT,
user_id int(20) NULL DEFAULT NULL,
balance decimal(20, 0) NULL DEFAULT NULL,
update_time datetime(6) NULL DEFAULT NULL,
PRIMARY KEY (id) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

SET FOREIGN_KEY_CHECKS = 1;