开发者学堂课程【SpringBoot 实战教程:SpringBoot 的事务管理】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/651/detail/10803
SpringBoot 的事务管理
内容介绍:
一、定义
二、案例
一、定义
1、事务管理是为了保证一组操作要执行都执行,不执行都不执行,所以在项目中事务管理是非常必要的,在 springboot 中可以使用xml配置文件方式或者是注解的方式进行声明事务,在 SpringBoot 中推荐使用 @Transactional 注解来声明事务。
2、当使用了 spring-boot-starter-jdbc
或
spring-boot-starter-data-jpa
依赖的时候,SpringBoot 会自动默认分别注入 DataSourceTransactionManager
或
JpaTransactionManager
,先不考虑 jpa。
二、案例
1、前边写过 springboot 整合 jdbcTemplate 案例,在这个基础之上添加事务的管理,事务是用在 service 上,因为 service 都是业务,要保证业务成功都成功,出现异常就全部回掉,在这里面有一个添加用户的功能,现在并没有进行事务管理,看一下存在的问题,比如在添加用户的业务中写入会导致异常的代码,只要在正常情况下这个业务发生异常,之前数据库操作应该回掉,说明当前添加的用户不应该插入到数据库表中,现在没有进行事务管理,它照样会把用户信息添加到表中,因为王喜之前已经添加过了,把王喜换成王欢,启动。访问,controller叫saveuser,会发生异常,王欢被添加到表中。没有添加事务管理。
可以看到王欢被添加到表中。实际上不应该把它添加到表中,因为在业务中已经发生异常。
添加事务管理,在方法上加 Transactional 注解,因为 springboot 已经默认配置了事务管理。只要发生异常,所有数据库都会发生回滚,这时用户就不能被添加到表中。把名字改成王乐。
@Transactional
public void saveUser (Users user )
{
userDao. addUser (user) ;
Int
i=6/
0
;
}
重新启动,再次访问。页面出现异常,查看数据表中王乐没有被添加到表中,说明 Transactional 注解已经发挥作用了,这个是在整合 jdbcTemplate 的案例中。
2、springboot 整合 Mybatis 案例,这是对应的依赖 mybatis- spring-boot- starter,找到 service,这里面也有添加用户的功能,添加一个会导致异常的语句,调用添加用户的叫 addusers,王小二改成王小狗,这时没有在 service 上使用事务管理,即使发生异常,添加用户时也能加到数据库中,启动,controller 访问路径是 addusers。刷新表,王小狗依然出现在表中。
正常情况下不应该加到数据库中,这时需要使用事务管理,在方法上加 @Transactional,名字改成王小猫,再重新启动。这次添加了事务管理,所以在 service 层发生异常,它会就把添加用户的操作会滚掉,这时王小猫用户是不能被添加的,再次访问。
查看数据库,王小猫没有被添加到数据库中。事务管理只需要在相应业务上添加 @Transactional 即可,因为相应的事务管理器,springboot 已经默认注入。