事务三连
什么是事务
事务是一组操作的集合,是一个不可分割的操作单元。它会把所有的操作作为一个整体,要么一起向数据库提交,要么一起撤销。所以这组操作要么同时成功,要么同时失败。
为什么要有事务
在程序开发中,我们经常面临需要保证数据一致性的场景。比如转账操作: 第一步:A 账户 -100 元。 第二步:B 账户 +100 元。
如果没有事务,第一步执行成功了,第二步执行失败了,那么 A 账户的 100 元就平白无故消失了。使用事务就可以解决这个问题,让这一组操作要么一起成功,要么一起失败。
事务的操作
事务的操作主要有三步: 开启事务: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;
{
UserInfoService userInfoService;
DataSourceTransactionManager dataSourceTransactionManager;
TransactionDefinition transactionDefinition;
String {
dataSourceTransactionManager.getTransaction(transactionDefinition);
userInfoService.registryUser(name, password);
log.info();
dataSourceTransactionManager.commit(transactionStatus);
;
}
}







