事务三连
什么是事务
事务是一组操作的集合,是不可分割的整体。它将所有操作作为一个单元,要么一起向数据库提交,要么一起撤销。这意味着这组操作要么同时成功,要么同时失败。
为什么要有事务
开发中常遇到需要原子性的场景。例如转账:
- A 账户 -100 元。
- B 账户 +100 元。
如果没有事务保护,第一步成功后第二步失败,A 的 100 元就会凭空消失。引入事务后,这一组操作将保持原子性,确保资金安全。
事务的操作
核心流程包含三步:
- 开启事务:
start transaction/begin(在执行一组操作前) - 提交事务:
commit(全部成功后) - 回滚事务:
rollback(任一操作异常时)
Spring 中事务的实现
Spring 提供了两种事务管理方式:编程式事务(手动控制)和声明式事务(基于注解)。
准备工作
我们需要准备好数据模型及访问代码。整体结构通常包含 Controller、Service 和 Mapper 层,数据库涉及用户表和日志表等。

数据库表结构示例:
log_infouser_info
Spring 编程事务
这种方式需要手动编写代码来控制事务边界。虽然灵活,但侵入性强,维护成本较高。
package com.hbu.springtransdemo.controller;
import com.hbu.springtransdemo.service.UserInfoService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionStatus;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@Slf4j
@RestController
@RequestMapping("/User")
public {
UserInfoService userInfoService;
DataSourceTransactionManager dataSourceTransactionManager;
TransactionDefinition transactionDefinition;
String {
dataSourceTransactionManager.getTransaction(transactionDefinition);
userInfoService.registryUser(name, password);
log.info();
dataSourceTransactionManager.commit(transactionStatus);
;
}
}


