springboot事务管理学习总结

一、查看自己数据表是否支持事务
sqlserver:默认支持事务
MySQL:默认的存储引擎为MyISAM不支持事务,需要改成InnoDB才能支持事务
在这里插入图片描述
二、在spring boot入口函数添加@EnableTransactionManagement注解是否有必要??

2.1百度了很多都说要在springboot启动加上@EnableTransactionManagement才能生效,但是实际操作中发现springboot是默认开启的,所以不用加此注解
如下图:springboot启动时就开启了事务配置
在这里插入图片描述
在这里插入图片描述
三、用系统默认的数据源,事务回滚的方法如下:

3.1 基于controller-service-dao三层来写代码,从入口开始,controller层的方法对应的是某个url,面向的是应用人员,应该返回他们能读懂的信息,所以controller必须做异常处理,一般来说会有统一的异常处理方法;

3.2 service层面向的是controller,service层中的某些方法,必须保证其事务,所以在service层进行事务控制是相当必要的,对于多条sql进行事务控制,如果某个sql执行失败,那么应当对已经执行的sql语句进行回滚;

3.3 dao层更多是单一的sql语句,没有必要进行事务控制,因为事务开销并不便宜(官方原话);

基于以上三点,一般情况应该把异常网上抛,一直抛到最终处理的那一层,所以对于dao层和service其实是没有必要进行try-catch的,直接往上抛异常就可以。

与之对应的,是spring的事务配置,默认情况下,spring只对运行时异常进行回滚,如果在dao层处理了异常,那么需要进行额外的配置,spring才会对异常进行回滚,常用的配置是@Transactional(rollbackFor=Exception.class)
在这里插入图片描述
如果需要在service使用try-catch,则需要手动抛出异常并,设置手动回滚,因为
Spring的AOP即声明式事务管理默认是针对unchecked exception回滚。也就是默认对RuntimeException()异常或是其子类进行事务回滚;checked异常,即Exception可try{}捕获的不会回滚
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly()
在这里插入图片描述

	方法A调用方法B事务生效总结
	
	备注:有事务Transactional用√    没有事务用×
方法A 方法B 是否事务生效 备注
此时事务生效
× 此时事务生效
× × × 此时事务不生效
× × 此时事务不生效

四、用第三方数据源事务配置(比如druid)

4.1 想让事务生效,需要在第三方数据源配置类(DruidConfig)中添加如下代码

// 创建第三方数据源事务管理器
@Bean
public DataSourceTransactionManager txManager(DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}

yml配置说明如下(必须指定第三方数据源的type)
在这里插入图片描述
DruidConfig部分代码如下
在这里插入图片描述
在这里插入图片描述
其余用法同第三点

仍在不断学习中,如有不妥还望各位大神留言指教
参考:https://4876391520.iteye.com/blog/2300772
https://blog.csdn.net/f641385712/article/details/80445912

猜你喜欢

转载自blog.csdn.net/qq_37493556/article/details/90246744
今日推荐