事务三连
什么是事务
事务是一组操作的集合,是一个不可分割的操作单元。它将所有操作视为一个整体,要么一起向数据库提交,要么一起撤销。这意味着这组操作要么同时成功,要么同时失败。
为什么要有事务
开发过程中经常遇到需要保证数据一致性的场景。比如转账:
- A 账户扣款 100 元。
- B 账户入账 100 元。
如果没有事务保护,第一步成功后第二步失败,A 账户的钱就凭空消失了。引入事务后,这一组操作要么全部完成,要么全部回滚,确保资金安全。
事务的操作
核心流程包含三步:
- 开启事务:
start transaction/begin(在执行一组操作前) - 提交事务:
commit(确认所有操作成功) - 回滚事务:
rollback(任一操作异常则撤销)
Spring 中事务的实现
Spring 提供了两种事务管理方式:
- 编程式事务:手动编写代码控制事务边界。
- 声明式事务:基于注解自动管理,推荐使用。
准备工作
我们需要准备好基础数据和访问层代码。这里涉及两个表:log_info 和 user_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 class UserController {
@Autowired
private UserInfoService userInfoService;
@Autowired
DataSourceTransactionManager dataSourceTransactionManager;
TransactionDefinition transactionDefinition;
String {
dataSourceTransactionManager.getTransaction(transactionDefinition);
userInfoService.registryUser(name, password);
log.info();
dataSourceTransactionManager.commit(transactionStatus);
;
}
}


