# simple-at **Repository Path**: kk-lulinfeng/simple-at ## Basic Information - **Project Name**: simple-at - **Description**: 基于seata中的AT模式,实现简单的AT - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-07-24 - **Last Updated**: 2025-07-24 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # simple-at项目文档 ## 项目概述 simple-at是一个基于Spring Boot和MyBatis-Plus的分布式事务解决方案,实现了AT模式的事务管理。该项目提供了全局事务注解、自动生成回滚SQL、事务日志记录等核心功能,确保分布式环境下的数据一致性。 ## 技术栈 - **核心框架**: Spring Boot 2.7.10 - **ORM框架**: MyBatis-Plus 3.5.3.1 - **数据库**: MySQL 8.0.33 - **编程语言**: Java 11 - **其他依赖**: - Lombok (简化Java代码) - Hutool (工具类库) - FastJSON2 (JSON处理) - Spring AOP (面向切面编程) ## 项目结构 ``` src/main/java/com/cenlak/at ├── ATApplication.java // 应用入口类 ├── SQLGenerator.java // SQL生成工具类 ├── UndoLog.java // 回滚日志实体 ├── annotation/ // 自定义注解 │ └── GlobalTransaction.java // 全局事务注解 ├── aop/ // AOP切面 │ └── ATTransactionAspect.java // 事务切面实现 ├── context/ // 上下文管理 ├── manager/ // 事务管理器 │ └── ATTransactionManager.java // 事务管理核心类 ├── mapper/ // 数据访问层 ├── service/ // 服务层 │ └── ATRollbackService.java // 回滚服务 └── v1/ // 业务模块 ├── controller/ // 控制器 ├── domain/ // 领域模型 ├── mapper/ // 数据访问接口 └── service/ // 业务服务 ``` ## 数据库设计 ### 主要数据表 #### orders表 ```sql create table orders ( id bigint auto_increment primary key, user_id bigint not null, order_no varchar(32) not null, amount decimal(10, 2) not null, status tinyint not null comment '0:待支付 1:已支付 2:已取消', created_at timestamp default CURRENT_TIMESTAMP null, updated_at timestamp default CURRENT_TIMESTAMP null on update CURRENT_TIMESTAMP ); create index idx_order_no on orders (order_no); create index idx_user_id on orders (user_id); ``` #### product表 存储商品信息,包含id、名称、价格、库存等字段。 #### temp_undo_log表 用于存储事务回滚日志,包含分支事务ID、全局事务ID、表名、SQL类型、前镜像和后镜像等信息。 ## 核心功能 ### 1. 全局事务管理 通过`@GlobalTransaction`注解标记需要进行全局事务管理的方法: ```java @Override @GlobalTransaction @Transactional public void test(Long productId) throws InterruptedException { // 业务逻辑 } ``` ### 2. 事务回滚机制 系统会自动记录数据操作的前镜像和后镜像,在事务失败时生成回滚SQL: - INSERT操作:生成DELETE回滚SQL - UPDATE操作:生成恢复原数据的UPDATE回滚SQL - DELETE操作:生成INSERT回滚SQL ### 3. AOP切面实现 通过AOP切面拦截所有标注了`@GlobalTransaction`的方法,实现事务的开始、提交和回滚: - 事务开始:生成全局事务ID - 事务提交:提交本地事务 - 事务回滚:执行回滚SQL恢复数据 ## API接口 ### 订单相关接口 #### 测试全局事务 - 请求URL: `/orders/test/{productId}` - 请求方法: GET - 参数说明: productId - 商品ID - 功能描述: 测试全局事务功能,包含商品创建和订单创建操作 ## 使用示例 ### 1. 添加全局事务注解 在需要进行事务管理的服务方法上添加`@GlobalTransaction`注解: ```java @Service public class OrdersServiceImpl extends ServiceImpl implements IOrdersService { @Override @GlobalTransaction @Transactional public void createOrder(OrderDTO orderDTO) { // 创建订单逻辑 // 扣减库存逻辑 } } ``` ### 2. 配置数据库连接 在application.yml中配置数据库连接信息: ```yaml spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/caffeine?useSSL=false username: root password: 1234 ``` ## 注意事项 1. 确保数据库连接配置正确 2. 被`@GlobalTransaction`注解的方法需要同时添加`@Transactional`注解 3. 事务回滚依赖于temp_undo_log表,请确保该表存在 4. 目前仅支持MySQL数据库 ## 项目启动 1. 配置数据库连接信息 2. 创建所需数据表 3. 运行ATApplication类的main方法 4. 应用将在默认端口启动