事务基础概念
事务是一组操作的集合,作为一个不可分割的整体执行。这组操作要么同时成功提交,要么同时失败回滚。
为什么需要事务
开发中常遇到涉及多步数据库操作的业务场景。例如转账:
- A 账户扣款 100 元。
- B 账户入账 100 元。
如果没有事务保护,第一步成功后第二步失败,A 的钱就凭空消失了。引入事务后,这一组操作会绑定在一起,确保数据的一致性。
事务生命周期
事务的操作核心在于三个步骤:
- 开启事务:
start transaction或begin - 提交事务:
commit(全部成功时) - 回滚事务:
rollback(任一环节异常时)
Spring 中的事务实现
Spring 提供了两种事务管理方式:编程式事务和声明式事务。后者在实际开发中更为常用。
准备工作
为了演示效果,我们需要准备基础的数据表结构(如 log_info, user_info)以及对应的 Service 层代码。这里省略具体的建表语句,重点看业务逻辑。
编程式事务
这种方式需要手动编写代码来控制事务的边界。通过 DataSourceTransactionManager 获取事务状态对象,然后显式调用提交或回滚。
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
private DataSourceTransactionManager dataSourceTransactionManager;
TransactionDefinition transactionDefinition;
String {
dataSourceTransactionManager.getTransaction(transactionDefinition);
userInfoService.registryUser(name, password);
log.info();
dataSourceTransactionManager.commit(transactionStatus);
;
}
}


