首页
学习
活动
专区
圈层
工具
发布

记录一次Spring事务线上异常

Spring事务管理配置方式: XML模糊匹配,绑定事务管理 注解,可对每个需要进行事务处理的方法单独配置,只需 @Transactional,然后添加属性配置 为简便,本文使用注解方式。...Spring初始化时,会通过扫描拦截对事务的方法进行增强。若目标方法存在事务,Spring就会创建一个Bean对应的代理(Proxy)对象,并进行相关的事务处理操作。...2 unchecked 异常与事务回滚 用户管理功能,每位用户注册后,都往数据库里存入信息: Mapper类: 数据库表Schema: 业务类 StudentService包括一个保存的方法...测试该事务是否回滚:若发现用户名=JavaEdge,抛异常,触发事务回滚。...#rollback =》事务才回滚: 综上,Spring 处理事务时,若没有在 @Transactional 配置 rollback 属性,则只有捕获到 RuntimeException 或 Error

70410
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Java异常总结和Spring事务处理异常机制浅析

    Spring事务回滚与异常 Spring被事务管理的方法,需要抛出非检查异常,即运行期异常才能进行回滚 对非检查型类异常可以不用捕获,而检查型异常则必须用try语句块进行处理或者把异常交给上级方法处理总之就是必须写代码处理它...所以必须在service捕获异常,然后再次抛出,这样事务方才起效。...在spring的事务管理环境下,使用unckeckedException可以极大地简化异常的处理,只需要在事务层声明可能抛出的异常(这里的异常可以是自定义的unckecked exception体系),...每一个业务方法开始时都会打开一个事务。 Spring默认情况下会对运行期例外(RunTimeException)进行事务回滚。这个例外是unchecked如果遇到checked意外就不回滚。...需要强调的是Spring的异常机制重点在于应用编程模型。与SqlException和其他数据存取API不同的是: Spring的异常机制是为了让开发者使用最少, 最清晰的代码。

    1.5K40

    哪些异常是RuntimeException?Sql异常属于RuntimeException吗?Spring下SQL异常事务回滚

    更多Spring事务问题请访问链接:Spring事务回滚疑难详解 一,为什么框架中根本没有对Exception的一般子类进行回滚配置,异常发生时,事务都进行了回滚 ,说好的只会对RuntimeException...受检异常(Checked)一般在编译期就被检出,这就给你造成了一个Spring对于所有异常都会发生回滚的误解。...② 实际上,当我们在项目开发中加入了Spring框架以后,SQL异常都被org.springframework重写,正如上面的重复主键的SQL异 常。...产生原因:很显然该异常原因属于一般异常,而被Spring捕捉后抛出其他自定义的RuntimeException 具体可见:org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate...RuntimeException的子类 得出结论:Spring框架下,所有SQL异常都被org.springframework重写为RuntimeException,事务因此也会发生回滚!

    1.4K40

    Spring事务异常回滚需要数据库引擎支持

    TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); } 其实像第一种try catch这种把整个包裹起来,这种业务方法也就等于脱离了spring...事务的管理,因为没有任何异常会从业务方法中抛出,全被捕获并“吞掉”,导致spring异常抛出触发事务回滚策略失效。...如果在catch代码块中采用页面硬编码的方式使用spring api对事务做显式的回滚,这样写也是可以的。...InnoDB:支持事务处理,支持外键,支持崩溃修复能力和并发控制。如果需要对事务的完整性要求比较高(比如银行),要求实现并发控制(比如售票),那选择InnoDB有很大的优势。...如果需要频繁的更新、删除操作的数据库,也可以选择InnoDB,因为支持事务的提交(commit)和回滚(rollback)。 MyISAM:插入数据快,空间和内存使用比较低。

    1.1K10

    Spring 双层事务,抛出的异常消失在隐秘的角落?

    纳闷了一会儿,看到双层事务,就想起了 Spring事务传播机制,前边理解得比较肤浅。Spring 系列面试题和答案我全部整理好了,请关注公众号Java技术栈,回复:面试。...6、PROPAGATION_NEVER 以非事务方式运行,如果存在事务,就抛出异常。...7、PROPAGATION_NESTED 开始执行事务前,先保存一个savepoint,当发生异常时,就回滚到savepoint;没有异常时,跟着外部事务一起提交或回滚。...具体原因 1、看了上边的事务传播机制,继续细化问题,内外层共用一个事务,内层抛出异常,会导致整个事务失败。...另外,大家想学 Spring Boot 的看下这个仓库,太全了。 https://github.com/javastacks/spring-boot-best-practice 怎么解决?

    89210

    spring事务

    二、事务的特性(ACID) 原子性:确保动作要么全部完成,要么完全不起作用 一致性:一旦所有事务动作完成,事务就要被提交。...数据保持一致性 隔离性:多个事务会同时处理相同的数据,每个事务都应该隔离开,防止数据损坏 持久性:事务一旦完成,无论系统如何,结果不受影响,事务结果持久化到硬盘中 三、基于xml配置文件方式 事务方法(增删改)之间互相调用,事务的管理方式 isolation:事务传播行为 timeout:超时时间 ⑴ 事务需要在一定时间内进行提交,如果不提交进行回滚 ⑵ 默认值为-1,不超时...readOnly:是否只读 ⑴ 默认false,可以查询,可以增删改 ⑵ 设置为true,只能查询 rollabckFor:回滚 ⑴ 设置出现哪些异常进行事务回滚 noRollabckFor...:不回滚 ⑴ 设置出现哪些异常不进行回滚 六、完全注解开发 @Configuration //配置类 @ComponentScan(basePackages = "com.xc") //组件扫描

    25400

    Spring事务

    一、Spring事务简介 事务作用:在数据层保障一系列的数据库操作同成功同失败 Spring事务作用:在数据层或业务层保障一系列的数据库操作同成功同失败 实现: 通过PlatformTransactionManager...,转账失败,但是异常之前操作成功,异常之后操作失败,整体业务失败 开启事务: Spring配置类中使用@EnableTransactionManagement注解开启事务管理 在JdbcConfig中设置事务管理器...@Transactional注解开启事务 Spring注解式事务通常添加在业务层接口中而不会添加到业务层实现类中,降低耦合 注解式事务可以添加到业务方法上表示当前方法开启事务,也可以添加到接口上表示当前接口所有方法开启事务...三、Spring事务角色 事务管理员:发起事务方,在Spring中通常指代业务层开启事务的方法 事务协调员:加入事务方,在Spring中通常指代数据层方法,也可以是业务层方法 四、事务相关配置 属性...设置是否为只读事务 boolean readOnly=true 只读事务 timeout 设置事务超时时间 int (秒) time = -1 永不超时 rollbackFor 设置事务回滚的异常类数组

    39821

    Spring事务

    1、什么是事务? 事务是指逻辑上的一组操作,这组操作要么全部成功,要么全部失败。 2、事务的特性 ①原子性:指事务的操作要么全部都发生,要么都不发生。...③隔离性:指多个事务并发访问数据库时,一个用户的事务不能被其他用户的事务所干扰,多个并发事务之间数据要相互隔离(可以通过设置事务的隔离级别解决,后续会讲到)。...3、Spring事务管理器 Spring事务管理器高层抽象接口主要有3个接口 ①PlatformTransactionManager(平台事务管理器):主要是进行事务的提交回滚等功能。...③TransactionStatus(事务具体运行状态):包括事务是否已提交、是否是新创建的事务、是否有保存点等。...4、PlatformTransactionManager接口 根据不同的持久化框架提供了不同的PlatformTransactionManager接口实现: ①使用Spring JDBC或iBatis

    75600

    Spring 事务和事务传播机制

    编程式事务 Spring 手动操作事务和 MySQL 操作事务类似,也是分为开启事务,提交事务,回滚事务等三个操作,需要用到 DataSourceTransactionManager (事务管理器)来进行上述事务的操作...> spring-tx 只需在要执行的方法上添加@Transactional注解,添加之后,如果没有发生异常就正常执行,...如果发生了异常就回滚事务 来看异常的情况: 这时事务就没有提交,进行了回滚 3....,执行结束之后会自动提交事务,如果方法执行过程中出现异常且异常未被捕获,就进行事务回滚操作 例如,把上面的异常代码 catch 起来,事务就正常提交了 但是如果捕获之后又进行抛出,那么事务还是会回滚的...事务传播机制 事务传播机制是指在多个事务方法相互调用时,定义事务如何在这些方法之间传播的规则,也就是延用调用方法的事务还是再重新开启一个新事务 Spring 事务的传播机制有以下七种 事务传播机制 描述

    62010

    【Spring源码】Spring事务原理

    2、Spring事务基本概念 2.1、基础配置 我们先来回顾一下Spring事务的基础配置信息,以下由ChatGPT给我们提供的相关资料: 2.1.1、Spring事务的基础配置 1、问:Spring事务的基础配置...PROPAGATION_MANDATORY:表示必须在一个已存在的事务中执行,否则抛出异常。...PROPAGATION_NEVER:表示以非事务的方式执行操作,如果当前存在事务,则抛出异常。...此时createOrder()方法可以直接try-catch异常,然后进行分支逻辑事务处理。...非公共方法:只有公共方法才会被代理,如果事务注解被用于非公共方法,那么事务也不会生效。 异常被捕获:如果在事务方法内部抛出异常,但是异常被捕获并处理了,那么事务就不会生效。

    71510

    spring事务传播

    Spring 事务不生效的原因 同一个类中无事务方法调用一个有事务方法事务不生效 public void testTransactionWork() { insertTransaction();...Spring 事务的传播级别 Spring 事务传播级别与数据库事务隔离级别不同,传播分为 7 种级别: PROPAGATION_REQUIRED:Spring的默认传播级别,如果上下文中存在事务则加入当前事务...如果外层有事务并抛出异常,被嵌套的内层事务会回滚,反之如果内层事务抛出异常,外层事务不受影响。...这里的原因是,当事务发生异常会设置一个状态 Rollback, 如果外围事务读到了这个异常的状态,提交的时候就会抛出上述的异常(详细代码可以看参考资料中 Spring 事务源码分析) PROPAGATION_REQUIRES_NEW...,内部事务为外围事务的子事务,插入“张三”内部方法抛出异常,可以单独对子事务回滚 参考资料 Spring 事务源码剖析 一口气说出6中@Transactional失效的场景

    93920

    spring事务配置

    (包括继承了RuntimeException子类),普通异常是不会滚的 * 编写业务逻辑方法时,最好将异常一直向上抛出,在表示层(struts)处理 * 关于事务边界的设置,通常设置到业务层,不要添加到...如果没有事务,则非事务的执行 3.PROPAGATION_MANDATORY: 如果已经存在一个事务,支持当前事务。如果没有一个活动的事务,则抛出异常。...6.PROPAGATION_NEVER: 总是非事务地执行,如果存在一个活动事务,则抛出异常 7.PROPAGATION_NESTED:如果一个活动的事务存在,则运行在一个嵌套的事务中....如果没有活动事务,  则按TransactionDefinition.PROPAGATION_REQUIRED 属性执行 4、Spring事务的隔离级别:级别超高效率越低 1.ISOLATION_DEFAULT...spring中对hibernate的支持的几个重要API: hibernateDaoSupport实现了一个辅助的dao,他拿出来的session也是放到ThreadLocal里面的.

    1.1K90

    Spring事务(下)

    将事务标识为只读,只读事务不修改任何数据; 对于JDBC只是简单的将连接设置为只读模式,对于更新将抛出异常; 对于一些其他ORM框架有一些优化作用,如在Hibernate中,Spring事务管理器将执行...setDefaultTimeout(10) 回滚规则 spring事务管理器会捕捉任何未处理的异常,然后依据规则决定是否回滚抛出异常的事务 默认配置下,Spring只有在抛出的异常为运行时unchecked...异常时才回滚该事务,也就是抛出的异常为RuntimeException的子类(Errors也会导致事务回滚),而抛出checked异常则不会导致事务回滚。...可以明确的配置在抛出那些异常时回滚事务,包括checked异常。...,在回滚或提交的时候需要应用对应的事务状态 编程式和声明式事务 Spring提供了对编程式事务和声明式事务的支持,编程式事务允许用户在代码中精确定义事务的边界 而声明式事务(基于AOP)有助于用户将操作与事务规则进行解耦

    1.1K30

    Spring 事务介绍

    Spring 本身并不实现事务,Spring 事务的本质还是底层数据库对事务的支持,没有数据库事务的支持,Spring 事务就不会生效。...Spring 事务提供了一套抽象的事务管理,并且结合 Spring IOC 和 Spring AOP,简化了应用程序使用数据库事务,并且通过声明式事务,可以做到应用程序无侵入的事务功能。...Spring 事务的本质其实就是 AOP 和 数据库事务,Spring 将数据库的事务操作提取为切面,通过 AOP 的方式增强事务方法。...如果当前没有事务,则抛出异常;如果当前存在事务,加入到这个事务中。...PROPAGATION_NEVER:不能在事务中执行。如果当前没有事务,那么就以非事务的形式执行;如果当前存在事务,则抛出异常。

    85630

    spring 之 事务

    2.3 声明式事务 Spring框架提供了声明式事务管理的功能,允许开发者通过配置来定义事务规则,而无需编写大量的事务管理代码。...3.7 事务属性:回滚策略 ①介绍 声明式事务默认只针对运行时异常回滚,编译时异常不回滚。...虽然购买图书功能中出现了数学运算异常(ArithmeticException),但是我们设置的回滚策略是,当出现ArithmeticException不发生回滚,因此购买图书的操作正常执行 3.8 事务属性...以下是Spring基于XML的声明式事务是如何实现的简要步骤: 4.1、准备工作 可以直接把基于注解的声明式事务的工程直接拷贝一份,改个名字即可 4.2、修改Spring配置文件 将Spring配置文件中去掉...-- rollback-for属性:设置回滚的异常 --> 异常 --> <!

    35310

    Spring之事务

    bookDao.updateStock(bookId); //更新用户的余额 bookDao.updateBalance(userId, price); } 对增删改操作设置只读会抛出下面异常...:回滚策略 声明式事务默认只针对运行时异常回滚,编译时异常不回滚 可以通过@Transactional中相关属性设置回滚策略 rollbackFor属性:需要设置一个Class类型的对象 noRollbackFor...bookId); //更新用户的余额 bookDao.updateBalance(userId, price); System.out.println(1/0); } 出现了数学运算异常...,就以非事务方式执行【有就加入,没有就不管了】 MANDATORY(mandatory):必须运行在一个事务中,如果当前没有事务正在发生,将抛出一个异常【有就加入,没有就抛异常】 REQUIRES_NEW...抛出异常【不支持事务,存在就抛异常】 NESTED(nested):如果当前正有一个事务在进行中,则该方法应当运行在一个嵌套式事务中。

    34510
    领券