概述
Spring ⼿动操作事务和 MySQL操作事务类似,有 3 个重要操作步骤:
• 开启事务(获取事务)
• 提交事务
• 回滚事务
重点
SpringBoot 内置了两个对象:
1. DataSourceTransactionManager 事务管理器.⽤来获取事务(开启事务),提交或回滚事务的
2. TransactionDefinition 是事务的属性,在获取事务的时候需要将 TransactionDefinition 传递进去从⽽获得⼀个事务TransactionStatus
流程
我们通过代码来学习操作事务的具体流程
并没有给出完整的代码,只需要知道从 Spring IoC 容器中获取 userService 对象,可以通过 userService 对象调用 insertUser() 方法向数据库插入数据即可
操作事务流程:
1.DataSourceTransactionManager 和 TransactionDefinition 类的对象是内置于 Spring 中的,所以直接通过 @Autowired 注解从 Spring IoC 容器中获取即可。
其中 DataSourceTransactionManager 代表事务管理器,TransactionDefinition 代表事务的属性,不进行处理的话就是默认的属性
2. transactionManager(事务管理器)调用 getTransaction() 方法,以事务管理器的属性对象 transactionDefinition 作为参数创建一个事务,事务的类型为 TransactionStatus
3.1 事务中的操作执行完毕后手动回滚事务,用 transactionManager 调用 rollback() 方法,要指明回滚的事务是谁,所以参数就是事务 transactionStatus
3.2 事务中的操作执行完毕后手动提交事务,用 transactionManager 调用 commit() 方法,要指明回滚的事务是谁,所以参数就是事务 transactionStatus
@Slf4j
@RequestMapping("/UserController")
@RestController
public class UserController {
@Autowired
private UserService userService;
//事务管理器
@Autowired
private DataSourceTransactionManager transactionManager;
//事务的属性对象
@Autowired
private TransactionDefinition transactionDefinition;
@RequestMapping("/registry")
public String registry(String userName,String password){
//开启事务
//transactionStatus 是事务执行前数据库的状态
TransactionStatus transactionStatus=transactionManager.getTransaction(transactionDefinition);
//事务执行的内容
Integer result=userService.insertUser(userName,password);
log.info("成功插入"+result+"条数据");
//事务回滚
//transactionManager.rollback(transactionStatus);
//提交事务
transactionManager.commit(transactionStatus);
return "注册成功";
}
}
效果展示
当手动回滚事务以后,数据库中就没有插入对应的数据,但因为是插入后再回滚,所以从自增主键被占用一位可以看出痕迹,手动提交事务就正常的将数据插入到数据库中
提交事务得到的日志:
回滚事务得到的日志:
从日志可以看出,提交事务有 committing (提交事务),deregistering(销毁事务),closing(关闭事务)等操作文章来源:https://www.toymoban.com/news/detail-821555.html
而回滚事务只有 deregistering(销毁事务),closing(关闭事务)等操作文章来源地址https://www.toymoban.com/news/detail-821555.html
到了这里,关于Spring 编程式事务 (Spring 重点)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!