导读:一段被try-catch包裹后的代码在产线稳定运行了200天后忽然发生了异常,而这个异常竟然导致了产线事务回滚。这期间究竟发生了什么?日常在项目过程中该如何避免事务异常?...而造成事务回滚的,竟然是一段被try-cath包裹后的代码,一段已经在产线稳定运行了200天的代码,稳定到我们已经把它遗忘了。...当他告诉我一段try-catch的代码造成产线事务回滚后,我温柔、耐心地对他说:“滚一边去,没看我正忙着吗?”,然后他给我甩出了一段代码,用猥琐又真诚的眼睛告诉我,他说的是真的。...我们可以把事务控制机制理解为上图这样一个红色的长长的房间,这个房间是有人看守的,他负责事务的开始、提交,还有一项重要的任务就是监控异常,一旦发现RuntimeException异常直接回滚整个事务,我们给他一个...Spring捕获异常后,正如我们所猜测的,事务将会被设置全局rollback,而最外层的事务方法执行commit操作,这时由于事务状态为rollback,Spring认为不应该commit提交事务,而应该回滚事务
使用@Transactional可以极大简化事务管理的复杂性,确保数据的一致性和完整性。概念@Transactional注解负责开启、提交或回滚一个事务。...它的工作原理是基于AOP(面向切面编程),在被注解的方法被调用时创建一个事务,并在方法执行结束时根据执行情况提交或回滚事务。如果方法正常完成,事务将被提交;如果方法抛出运行时异常,事务将被回滚。...readOnly:指示事务是否只读。这个属性可以帮助数据库应用一些优化,比如避免脏读。rollbackFor:定义哪些异常可以触发事务回滚。noRollbackFor:定义哪些异常不会触发事务回滚。...优点简化事务管理:@Transactional提供了一种声明式的方式来管理事务,这意味着开发者可以不必手动控制事务的开启、提交或回滚,简化了代码和减少了错误的可能性。...仅限于运行时异常回滚:默认情况下,@Transactional只对运行时异常进行回滚。如果需要对检查型异常进行回滚,需要额外配置,这可能会导致配置错误。
事务满足 ACID 原则: 原子性:不可分割,要么全部成功,要么全部失败 一致性:从一个状态到另一个状态 隔离性:正确提交前,可能到结果不应显示给其他事务 持久性:提交后,永久保存在数据库中 Java事务...booleanisReadOnly() 隔离规则 脏读:事务没提交,被提前读取。 不可重复读:两次读取数据不一致。 幻读:事务不是独立执行时发生的一种非预期现象。...如果当前正有一个事务在运行,则会抛异常 PROPAGATIONRNESTED 如果当前存在一个事务,则该方法会在嵌套事务中运行。嵌套的事务可以独立于当前事务进行单独的提交或回滚。...设计事务的注意点:事务不能运行太长时间,否则占用太久资源 事务回滚 运行期异常才回滚,而检查型异常不会回滚 自定义回滚策略 遇到特定的检查型异常时像运行期异常一样回滚。...事务状态 通过事务管理器获得TransactionStatus实例 控制事务回滚或提交时需要应用对应的事务状态 编程式事务管理概述 事务管理器方式 spring事务管理的三个接口 步骤: 获取事务管理器
事务回滚 在讲事务隔离级别和事务传播性之前,先讲一下SpringBoot中,我们平常是怎样控制事务回滚的。...因为在@Transactional注解的方法结束后,事务就被提交了。...().setRollbackOnly():捕获特定异常或自行判断后手动回滚 3....例:事务1中需要多次读取数据A,第一次读取完成后,事务2对数据A有操作,事务1再次读取数据A,会读取到事务2操作的结果,但事务2因异常进行了回滚。这时候事务1对数据A就产生了脏读。...; NEVER:非事务方式运行,如当前存在事务,则抛出异常; NESTED:如当前存在事务,则创建一个事务作为当前事务的子事务运行,随当前事务一起提交,当前事务回滚子事务也回滚,子事务可以独立回滚,当前事务不会回滚
这两个操作必定要全部成功,方才表示本次转账成功;若有任何一方失败,则另一方必须回滚(即全部失败)。...、是否只读、事务超时、回滚规则 2.1隔离级别 什么是事务的隔离级别?...,那么就会自动回滚,而不是一直等待其结束。...在 TransactionDefinition 中以 int 的值来表示超时时间,默认值是-1,其单位是秒 2.5回滚规则 回滚规则定义了哪些异常会导致事务回滚而哪些不会。...默认情况下,事务只有遇到运行期异常时才会回滚 3.TransactionStatus事务状态 org.springframework.transaction.TransactionStatus接口用来记录事务的状态
(true/false); 执行CRUD 提交事务/回滚事务 con.commit() / con.rollback(); 关闭连接 conn.close(); 使用Spring的事务管理功能后,我们可以不再写步骤...(开启正常提交事务,异常回滚事务)。...新建的事务将和被挂起的事务没有任何关系,是两个独立的事务,外层事务失败回滚之后,不能回滚内层事务执行的结果,内层事务失败抛出异常,外层事务捕获,也可以不处理回滚操作 PROPAGATION_SUPPORTS...如果 ServiceB.methodB() 失败回滚,如果他抛出的异常被 ServiceA.methodA() 捕获,ServiceA.methodA() 事务仍然可能提交(主要看B抛出的异常是不是A...会回滚的异常)。
(true/false); 执行CRUD 提交事务/回滚事务 con.commit() / con.rollback(); 关闭连接 conn.close(); 使用Spring的事务管理功能后,我们可以不再写步骤...(开启正常提交事务,异常回滚事务)。...真正的数据库层的事务提交和回滚是通过binlog或者redo log实现的。...新建的事务将和被挂起的事务没有任何关系,是两个独立的事务,外层事务失败回滚之后,不能回滚内层事务执行的结果,内层事务失败抛出异常,外层事务捕获,也可以不处理回滚操作 PROPAGATION_SUPPORTS...如果 ServiceB.methodB() 失败回滚,如果他抛出的异常被 ServiceA.methodA() 捕获,ServiceA.methodA() 事务仍然可能提交(主要看B抛出的异常是不是A会回滚的异常
回滚:ROLLBACK语句结束事务,放弃从开始的一切变更。 3....3.2 PlatformTransactionManager ( 事务管理器 ) PlatformTransactionManager 负责管理事务的开始,提交和回滚。...(读未提交) 允许读取到未提交的数据 允许其他事务读取到这个事务已修改而未提交的数据 READ_COMMITTED (读已提交) 允许读取已提交的数据 这个事务修改且提交后,才可用被其他事务读取到。...持有锁到提交时 SERIALIZABLE 持有锁到提交时 持有锁到提交时 5、Spring 事务的传播行为 Spring事务传播机制规定了事务方法和事务方法发生嵌套调用时事务如何进行传递。...创建一个新的事务并挂起当前事务 NOT_SUPPORTED 以非事务方式执行,如果当前存在事务则将当前事务挂起 NEVER 以非事务方式进行,如果存在事务则抛出异常 NESTED 如果当前存在事务,则在嵌套事务内执行
1.外部起事务,内部起事务,内外都有Try Catch 内部出错:如果内部事务出错,内部和外部事物全部回滚,外部回滚之前的操作全部不存在,但是之后的操作继续执行。...外部出错:如果外部事物出错,内部和外部事物全部回滚,外部回滚之前的操作全部不存在,但是之后的操作继续执行。 注:如果内部的事务不起事务名称,内部如果出错,将会回滚掉会话中的全部事务,而且报异常。...内部出错:如果内部事务出错,内部和外部事物全部回滚,外部回滚之前的操作全部不存在,但是之后的操作继续执行。...外部出错:如果外部事物在保存点之前出现异常,那么外部和内部所有操作回滚。如果外部事物在保存点之前出现异常,由于保存点已经提交了事务,导致外部rollback找不到对应的事务点。...ROLLBACK TRAN将@@TRANCOUNT减为0并回滚整个事务及其中嵌套的事务,无论它们是否已经被提交。因此,嵌套事务中所做的更新被回滚,数据没有任何改变。
现在如果调用 updateAcct() 方法后抛出异常,交易订单就会回滚,但帐户更新将会提交给数据库,如清单 12 所示: 清单 12....运行时异常(即非受控异常)自动强制执行整个逻辑工作单元的回滚,但受控异常不会。因此,清单 13 中的代码从事务角度来说毫无用处;尽管看上去它使用事务来维护原子性和一致性,但事实上并没有。...如果电子邮件服务器关闭,您将发送某种形式的 SMTP 受控异常,表示邮件无法发送。如果受控异常引起自动回滚,整个图书订单就会由于电子邮件服务器的关闭全部回滚。...通过禁止自动回滚受控异常,您可以捕获该异常并执行某种纠正操作(如向挂起队列发送消息),然后提交剩余的订单。...就不能改变主意了;惟一可能的结果是在启动事务的方法完成后回滚事务。
方法执行过程中,如果没有发生异常,则 Spring 会在方法执行结束后提交事务,将对数据库的更改持久化到数据库。 如果方法执行过程中抛出了异常,Spring 将捕获该异常并判断是否需要回滚事务。...原子性(Atomicity):事务是一个原子操作单元,要么全部执行成功,要么全部失败回滚。它是不可分割的最小操作单位,将多个操作视为一个整体进行处理。...嵌套事务和加入事务的区别: 嵌套事务和加入事务都是事务传播机制的不同实现方式,它们之间有以下区别: 事务范围: 嵌套事务是内部事务运行在外部事务的范围内,可以看作是外部事务的子事务,嵌套事务可以独立提交或回滚...加入事务是将一个方法或代码片段加入到已有的事务中,与外部事务共享同一个事务范围,不能单独提交或回滚。 事务行为: 嵌套事务具有独立的事务保存点,可以在内部事务中进行回滚操作,而不会影响外部事务的状态。...内部事务执行成功后,可以选择提交到外部事务或者继续嵌套使用。 加入事务没有独立的事务保存点,它的所有操作都与外部事务绑定,只有外部事务提交时,才会将加入事务的操作一同提交。
如果 addCredits()对应的内嵌事务执行失败,事务将回滚到addCredits()方法执行前的点,并不会将整个事务回滚。...内嵌事务是内层事务的一 部分,所以只有外层事务提交时,嵌套事务才能一并提交。 嵌套事务不能够提交,它必须通过外层事务来完成提交的动作,外层事务的回滚也会造成内部事务的回滚。...PROPAGATION_REQUIRES_NEW 启动一个新的、和外层事务无关的“内部”事务。该事务拥有自己的独立隔离级别和锁,不依赖于外部事务,独立地提交和回滚。...当内部事务开始执行时,外部事务 将被挂起,内务事务结束时,外部事务才继续执行。..., 而 PROPAGATION_NESTED 将创建一个依赖于外层事务的子事务,当外层事务提交或回滚时,子事务也会连带提交和回滚。
数据库事务是访问并可能操作各种数据项的一个数据库操作序列,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。事务由事务开始与事务结束之间执行的全部数据库操作组成。...持久性 事务提交后,对数据的改变是永久性的。...声明式事务管理:基于AOP实现。对方法前后进行拦截,在方法开始前创建或加入一个事务,执行后根据执行情况提交或回滚事务。 声明式事务管理优于编程式事务管理,主要是无侵入,低耦合。...Isolation isolation() default Isolation.DEFAULT; // 事务超时时间 默认-1不超时;设置后,超时则自动回滚 int timeout() default.../不回滚异常 默认`RuntimeException`异常时回滚 Class<?
事务是一组操作,它们被视为一个原子单元,要么全部成功执行,要么全部回滚。Spring Boot提供了对事务管理的简单而强大的支持,使开发人员可以更轻松地实现数据的一致性和完整性。...当一个方法被标记为@Transactional时,Spring Boot会在方法开始时创建一个事务,并在方法执行完成后根据执行结果决定是提交事务还是回滚事务。...当方法执行完成后,根据方法的执行结果决定是提交事务还是回滚事务。 @Transactional注解可以应用在方法级别和类级别上。...} } } 使用@Transactional注解,可以自动管理事务的开始、提交和回滚,从而实现数据一致性,在方法执行过程中,如果发生异常或错误,事务将被回滚,保证数据的一致性。...如果在业务操作中发生异常,事务可以自动回滚,保证数据的一致性。例如,在一个订单支付的操作中,如果支付过程中发生异常,可以通过事务回滚来取消订单并恢复库存。
当请求链路调用完成后,发起方通知 TC 提交或回滚分布式事务,进入二阶段调用流程。此时,TC 会根据之前注册的分支事务回调到对应参与者去执行对应资源的第二阶段。...TC 是怎么找到分支事务与资源的对应关系呢?每个资源都有一个全局唯一的资源 ID,并且在初始化时用该 ID 向 TC 注册资源。在运行时,每个分支事务的注册都会带上其资源 ID。...阶段 2 完成的是全局事务的最终提交或回滚,当全局事务中所有分支事务全部完成并且都执行成功,这时TM会发起全局事务提交,TC收到全全局事务提交消息后,会通知各分支事务进行提交;同理,当全局事务中所有分支事务全部完成并且某个分支事务失败了...对服务端来说,等到一阶段完成未抛异常,全局事务的发起方会向服务端申请提交这个全局事务,服务端根据 xid 查询出该全局事务后加锁并关闭这个全局事务,目的是防止该事务后续还有分支继续注册上来,同时将其状态从...图片来自https://chenjiayang.me 回滚相对复杂一些,如果发起方一阶段抛异常会向服务端请求回滚该全局事务,服务端会根据 xid 查询出这个全局事务,加锁关闭事务使得后续不会再有分支注册上来
事务传播行为是Spring框架提供的一种事务管理方式,它不是数据库提供的。不知道大家是否听说过“不要在service事务方法中嵌套事务方法,这样会提交多个事务”的说法,其实这是不准确的。...,运行结果: image.png image.png 运行报错了,但是数据却没有回滚掉。...根据定义,inserBatch的事务会被延缓。具体表现就是:后面的10次循环的事务在每次循环结束之后都会提交自己的事务,而inserBatch的事务,要等循环方法走完之后再提交。...但由于第10次循环会抛出异常,则inserBatch的事务会回滚,既数据库中不会存在:“初次调用”的记录: 测试代码: @Test public void insertBatchTest() {...所谓嵌套事务,大意就是,外围事务回滚,内嵌事务一定回滚,而内嵌事务可以单独回滚而不影响外围主事务和其他子事务。
事务传播行为是Spring框架提供的一种事务管理方式,它不是数据库提供的。不知道大家是否听说过“不要在service事务方法中嵌套事务方法,这样会提交多个事务”的说法,其实这是不准确的。...,运行结果: 运行报错了,但是数据却没有回滚掉。...根据定义,inserBatch的事务会被延缓。具体表现就是:后面的10次循环的事务在每次循环结束之后都会提交自己的事务,而inserBatch的事务,要等循环方法走完之后再提交。...但由于第10次循环会抛出异常,则inserBatch的事务会回滚,既数据库中不会存在:“初次调用”的记录: 测试代码: @Test public void insertBatchTest() {...所谓嵌套事务,大意就是,外围事务回滚,内嵌事务一定回滚,而内嵌事务可以单独回滚而不影响外围主事务和其他子事务。
真正的数据库层的事务提交和回滚是通过binlog或者redo log实现的。...新建的事务将和被挂起的事务没有任何关系,是两个独立的事务,外层事务失败回滚之后,不能回滚内层事务执行的结果,内层事务失败抛出异常,外层事务捕获,也可以不处理回滚操作 PROPAGATION_SUPPORTS...PROPAGATION_NESTED 如果一个活动的事务存在,则运行在一个嵌套的事务中。如果没有活动事务,则按REQUIRED属性执行。它使用了一个单独的事务,这个事务拥有多个可以回滚的保存点。...a、b、e回不回滚主要看是否抛出异常。 spring 什么情况下进行事务回滚?...Spring、EJB的声明式事务默认情况下都是在抛出unchecked exception后才会触发事务的回滚 unchecked异常,即运行时异常runntimeException 回滚事务; checked
「丢失回滚」(第一类事务丢失):丢失回滚指A事务提交了,但是B事务事务回滚了,当A提交成功但是B因为回滚事务回滚了A的数据,这时候对于A来说事务就算是丢失了。...「回滚规则」:规定了当前的事务会在什么情况下进行回滚,默认情况是按照运行时异常进行回滚,也可以设置指定某些异常不进行回滚,但是需要注意指定异常类必须是Throwable的子类。...rollbackFor:根据指定的Class异常类进行回滚,如果没有设置,默认为运行时异常,但是需要注意必须是able的子类。...每一个事务资源都是独立的,因此可以独立提交或回滚,外部事务同样不受内部事务回滚状态的影响,内部事务的锁在完成后立即释放。...嵌套事务意味着可以实现部分事务的回滚,但是嵌套的内部事务不会影响外部事务的执行。
由于开始时使用JPA内部的双向关联,造成各实体内部关联过多,从而影响所有的操作,因此怀疑是因为JPA的关联关系所致。但是去掉关联关系后的效果不显著。...PROPAGATION_SUPPORTS--支持当前事务,如果当前没有事务,就以非事务方式执行。 PROPAGATION_MANDATORY--支持当前事务,如果当前没有事务,就抛出异常。...PROPAGATION_NEVER--以非事务方式执行,如果当前存在事务,则抛出异常。 PROPAGATION_NESTED--如果当前存在事务,则在嵌套事务内执行。...key="myMethod"〉PROPAGATION_REQUIRED,readOnly,-Exception〈/prop〉 这样的配置,其中: -Exception表示有Exception抛出时,事务回滚...-代表回滚+就代表提交 readonly 就是read only, 设置操作权限为只读,一般用于查询的方法,优化作用.
领取专属 10元无门槛券
手把手带您无忧上云