首页 > 其他分享 >事务失效

事务失效

时间:2023-04-29 21:44:54浏览次数:31  
标签:事务 调用 spring 回滚 代理 失效 方法

spring用代理对象去调用方法才会生效, 在一个方法中去调用b其实是this去调用 ,所以不会生效

 可以注入自己的service,用cglib代理的对象调用的b方法 ,可以让事务生效

然后spring三级缓存会帮我们过滤循环依赖的问题

 

 

 

 

 

 

 

 

 

1. 如果用了private就不会生效事务, 必须是public权限的方法

2.用final定义的方法不会生效事务,spring底层用了apo ,cglib或者jdk动态代理 生成了代理类,在代理类里面实现了事务功能

3.在a方法调用b方法(b方法使用了事务),在同一个类中的方法,直接调用会导致事务失效  (解决方法,建一个新的service,调用原service的a和b方法)

4.多线程里面调用也无法生效事务,spring事务是通过数据库连接实现的,当前线程中保存了一个map,ThreadLocal,同一个数据库连接才能回滚,<key

是数据源,value是数据库连接)

 5.事物的传播特性,如果上下文存在事务,那么加入事务,如果不存在事务,会创建一个事务

 6.自己捕获了异常,就不会回滚事务

 

 

 

 

 

 

场景
1. 事务方法不是public修饰的,将会导致事务失效
2. 事务方法使用了final或static修饰,将会导致事务失效
3. 方法内部之间调用,没有通过代理对象调用
4. 未被spring容器管理,方法不会产生事务
5. 多线程调用dao方法
6. 表不支持事务
7. 未开启事务
8. 使用了错误的事务传播行为
9. 自己吞了异常
10. 抛出了编译时异常
11. 自定义了指定异常类(rollbackFor属性)回滚,但实际发生的异常类与指定的异常类不一致
12. 事务回滚多了
细节(和上面每一条一一对应):
1. AbstractFallbackTransactionAttributeSource类中的computeTransactionAttribute方法中只规定了public修饰的方法才可以
2. spring事务底层使用了AOP,而AOP的底层是动态代理,动态代理分为两种:1,JDK自带的动态代理,需要被代理类实现接口,2,基于cglib的动态代理,需要继承被代理类,final修饰的方法不能被重写,所以会导致final修饰的方法事务失效
3. 方法拥有事务能力是因为使用了代理对象的方法
4. 没有使用@Service注解交给spring容器管理
5. 不同线程获取到的数据库连接不一样,从而是两个不同的事务,spring事务是通过数据库连接来实现的(ThreadLocal),同一个数据库连接才可以同时提交和同时回滚
6. 例如mysql的表使用了myisam引擎
7. 非springboot项目,例如传统spring项目,需要配置事务管理器开启事务
8. @Transactional注解的propagation为NEVER(方法不支持事务)
9. 使用了try、catch捕获了异常而没有抛出异常,事务不会回滚,spring会认为程序是正常的
10. spring事务默认支持运行时异常的回滚,如果开发人员自己捕获并在catch里抛出了编译时异常,则不会回滚
11. 自定义了指定异常(rollbackFor属性)回滚,但实际发生的异常与指定的异常不一致
12. 一个方法内有两个事务方法调用a(),b(),其中b方法出现了异常,导致b方法向上抛出异常,使得a方法也跟着回滚了导致a方法事务失效

标签:事务,调用,spring,回滚,代理,失效,方法
From: https://www.cnblogs.com/ZhangZiXue/p/17364528.html

相关文章

  • mysql基础_事务
    定义一个事务其实就是一个完整的业务逻辑,是一个最小的工作单元,不可再分,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。例如:王五向赵六的账户上转2000块钱,王五的账户上少2000块钱,赵六的账户上多2000块钱,这个操作是一个最小的......
  • Mysql数据库设计和事务
    一对一在任意一方建立外键,关联另一方主键一对多在多的一方建立外键关联另一方的主键多对多1.建立中间表2.中间表至少包含2个外键,分别关联双方主键内连接1.隐式连接select*fromemp,deptwhereemp.dep_id=dept.did   2.显式连接select*fromemp(inner)joindep......
  • oracle 数据库事务,提交,回滚,保存点,表的锁定,隐式锁,显示锁,写锁,读锁,排他锁,共享
    [color=red]数据库事务的概念[/color]事务是由相关操作构成的一个完整的操作单元。两次连续成功的COMMIT或ROLLBACK之间的操作,称为一个事务。在一个事务内,数据的修改一起提交或撤销,如果发生故障或系统错误,整个事务也会自动撤销。比如,我们去银行转账,操作......
  • 实战案例 | 双束聚焦离子束(DB-FIB)和透射电子显微镜(TEM)在芯片失效分析中的组合应用
    在做HTGB(高温栅偏测试)项目时,出现了Passdie漏电较小,FaildieIGSS漏电过大(>200nA)的情况。需要对漏电大的芯片进行复测,同时定位漏电所在的位置(热点Hotspot)。之后再利用FIB/TEM对漏电位置进行微观结构/成分分析,找到漏电点所在的膜层;最后基于电镜分析的结果对失效机理做初步判断......
  • Sql Server 数据库事务与锁,同一事务更新又查询锁?期望大家来解惑
    我有一个People表,有三行数据:如果我们没详细了解数据库事务执行加锁的过程中,会不会有这样一个疑问:如下的这段SQL开启了事务,并且在事务中进行了更新和查询操作。BEGINTRAN updatePeoplesetName='张三'whereid=1; select*fromPeoplewhereid=1;committran我......
  • CamstarVP下拉选,筛选失效
    //CopyrightSiemens2019usingCamstar.WCF.ObjectStack;usingCamstar.WebPortal.FormsFramework;usingCamstar.WebPortal.FormsFramework.Utilities;usingCamstar.WebPortal.WCFUtilities;usingSystem;namespaceCamstar.WebPortal.WebPortlets{public......
  • 如何在微服务下保证事务的一致性
    作者:京东科技苗元背景随着业务的快速发展、业务复杂度越来越高,传统单体应用逐渐暴露出了一些问题,例如开发效率低、可维护性差、架构扩展性差、部署不灵活、健壮性差等等。而微服务架构是将单个服务拆分成一系列小服务,且这些小服务都拥有独立的进程,彼此独立,很好地解决了传统单体......
  • element-ui中多个表单el-form进行显示/隐藏切换时校验失效
    问题描述:当一个弹窗或页面中含有多个表单(都需要校验),且需要进行显示/隐藏切换时,容易造成切换后的表单元素的校验失效。如下: 第一个表单的输入框都触发blur提示语后,切换至第二个表单第二个表单的输入框触发blur后,第一个输入框的校验失效了。返回后,第一个输入框触发blur,校验......
  • 事务的相关知识
    事务相关概念事务是一组操作的集合,这些操作要么一起提交成功,要么一起失败;事务的四大特性:ACID:原子性(Atomicity):事务是不可分割的最小操作单元,要么全部成功,要么全部失败。一致性(Consistency):事务完成时,必须使所有的数据都保持一致状态。隔离性(Isolation):数据库系统提供的隔离机制,......
  • spring jdbc 编程式事务
    所谓编程式事务指的是通过编码方式实现事务,即类似于JDBC编程实现事务管理。新建maven工程,pom文件如下:<projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0http:/......