@Transactional(事务讲解)和springboot 整合事务

本文介绍了Spring Boot中声明式事务处理的使用,包括编程式事务处理与声明式事务处理的对比,重点讲解了@Transactional注解的使用,如在接口实现类或方法上使用、访问权限限制、异常处理和事务回滚规则。还讨论了多线程下事务管理的问题,以及SpringBoot中启用事务管理的配置方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概述
事务在编程中分为两种:声明式事务处理和编程式事务处理

**编程式事务处理:**编码方式实现事务管理,常与模版类TransactionTemplate(推荐使用) 在业务代码中实现事务。
可知编程式事务每次实现都要单独实现,但业务量大功能复杂时,使用编程式事务无疑是痛苦的,而声明式事务不同,声明式事务属于无侵入式,不会影响业务逻辑的实现。
声明式事务处理:
声明式事务实现方式主要有2种,一种为通过使用Spring的tx:advice定义事务通知与AOP相关配置实现,另为一种通过@Transactional实现事务管理实现,下面详细说明2种方法如何配置,已经相关注意点
1)方式一,配置文件如下
在这里插入图片描述
1)方式二(推荐),介绍如下
@Transactional 是声明式事务管理 编程中使用的注解
添加位置
接口实现类或接口实现方法上,而不是接口类中
访问权限:public 的方法才起作用
@Transactional 注解应该只被应用到 public 方法上,这是由 Spring AOP 的本质决定的。如果你在 protected、private 或者默认可见性的方法上使用 @Transactional 注解
系统设计:将标签放置在需要进行事务管理的方法上,而不是不假思索的放置在接口实现类上(接口中所有方法都需要进行事务管理,但其实并不需要,如只读的接口就不需要事务管理,但是由于配置了@Transactional就需要AOP拦截及事务的处理,影响系统性能)
方法上注解属性会覆盖类注解上的相同属性,当接口与接口中方法上同时带有@Transactional注解时
错误使用:
接口中A、B两个方法,A无@Transactional标签,B有,上层通过A间接调用B,此时事务不生效
接口中异常(运行时异常)被捕获而没有被抛出
默认配置下,spring只有在抛出的异常为运行时unchecked异常时才回滚该事务,也就是抛出的异常为RuntimeException的子类(Errors也会导致事务回滚),而抛出checked异常则不会导致事务回滚
可通过 @Transactional rollbackFor进行配置

多线程下事务管理
因为线程不属于spring托管,故线程不能够默认使用spring的事务,也不能获取spring注入的bean
在被spring声明式事务管理的方法内开启多线程,多线程内的方法不被事务控制
一个使用了@Transactional 的方法,如果方法内包含多线程的使用,方法内部出现异常,不会回滚线程中调用方法的事务
声明式事务管理实现方式:

• 基于tx和aop名字空间的xml配置文件
在这里插入图片描述
基于@Transactional注解
@Transactional实质是使用了JDBC的事务来进行事务控制的
@Transactional基于Spring的动态代理的机制
@Transactional实现原理

1)事务开始时,通过AOP机制,生成一个代理connect

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值