首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

SpringBoot 快速开启事务(附常见坑点)「建议收藏」

编写代码 以操作账户金额为例,模拟正常操作金额提交事务,以及发生异常回滚事务。...例如下面这段代码,账户余额依旧增加成功,并没有因为后面遇到SQLException(检测异常)而进行事务回滚!!....."); } 原因分析:因为Spring的默认的事务规则是遇到运行异常(RuntimeException及其子类)和程序错误(Error)才会进行事务回滚,显然SQLException并不属于这个范围...如果想针对检测异常进行事务回滚,可以在@Transactional 注解里使用 rollbackFor 属性明确指定异常。...这是许多新手都会犯的一个错误,在业务层手工捕捉并处理了异常,你都把异常“吃”掉了,Spring自然不知道这里有错,更不会主动去回滚数据。例如:下面这段代码直接导致增加余额的事务回滚没有生效。

1.5K20

【JavaEE进阶】Spring事务和事务传播机制

声明式事务的实现很简单,只需在方法上加入@Transactional 注解就可以实现,无需手动开启事务和提交事务,进入方法时自动开启事务,方法执行完会自动提交事务,如果途中发生了没有处理的异常就会自动回滚事务...手动回滚事务 @Transactional(timeout = 3) // 在方法开始之前开启事务,方法正常执行结束之后提交事务,如果执行途中发生异常,则回滚事务 @RequestMapping...,可以设置read-only为true. rollbackFor 用于指定能够触发事务回滚的异常类型,可以指定多个异常类型. rollbackForClassName 用于指定能够触发事务回滚的异常类型...如果中途遇到的异常,则回滚事务。 三. 事务的隔离级别 1....异常处理:在事务中,如果出现异常,事务传播机制可以决定是继续传播异常还是回滚事务。通过配置合适的传播行为,可以在异常发生时采取适当的处理方式,以保证数据的一致性。

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

    【二十四】springboot整合spring事务详解以及实战

    rollback-for 发生指定的异常后回滚,多个时逗号隔开,默认值是runtimeException isolation 事务隔离级别。 1:default:由数据库自动判断应使用什么隔离级别。...no-rollback-for 发生指定的异常不会回滚,多个时逗号隔开,没有默认值。 propagation 事务传播性。 1:REQUIRED:支持当前事务,如果当前没有事务,就新建一个事务。...2、事务发生指定的异常后回滚(rollback-for) 由于Spring事务的回滚会自动回滚发生的runtimeException异常,所以本小结的学习自定义一个自己的异常类型——MyException...上面已经测试过发生这个异常会回滚,所有这里直接测试将这个属性设置到no-rollback-for属性,测试是不是不会回滚? ​ ​...通过学习,我认为事务传播性基本上就是发生在多个方法上,比如A方法有事务,A方法内调用B方法,而B方法也有事务,或者A方法没有事务时,事务它到底如何处理,这就是事务传播机制。

    93310

    一个99%的人都说不清楚知识点——Spring 事务传播行为

    PROPAGATION_NEVER以非事务方式执行,如果当前存在事务,则抛出异常。PROPAGATION_NESTED如果当前存在事务,则在嵌套事务内执行。...,如果内部方法发生异常, * 只回滚内部方法执行过的 SQL ,而不回滚当前方法的事务 */ NESTED(TransactionDefinition.PROPAGATION_NESTED...由于「小镜」的插入方法发生异常,此时所有方法都处于同一个事务中,即使发生异常的部分被 try-catch 住,所有操作仍然会回滚 前面四种情况都比较好理解,很多人不能理解最后一种情况:我都 try-catch...,外部方法发生异常,主事务回滚,子事务跟随主事务回滚transaction_nested_nestedException小水和小镜均未入库外部方法开启事务,内部方法开启各自的子事务,「小镜」的插入方法发生异常回滚自己的子事务...(保存点),如果当前 NESTED 事务执行失败,则回滚到之前的保存点,保存点使得子事务的回滚不对主事务造成影响。

    52820

    一文搞懂什么是事务

    脏读 A事务读取B事务尚未提交的数据,此时如果B事务发生错误并执行回滚操作,那么A事务读取到的数据就是脏数据。就好像原本的数据比较干净、纯粹,此时由于B事务更改了它,这个数据变得不再纯粹。...; ② 选择事务结果类型; ③ 业务数据操作处理; ④ 业务执行完成事务提交或者发生异常进行回滚; 其中 TransactionTemplate 的 execute 能接受两种类型参数执行事务,分别为:...rollbackFor:回滚事务异常类定义,当方法中出异常,且异常类和该参数指定的类相同时,进行回滚操作,否则提交事务。...noRollbackFor:指定发生哪些异常不回滚事务,当方法中出异常,且异常类和该参数指定的类相同时,不回滚而是将继续提交事务。...使用事务时需要注意的点 1、遇到异常检测不回滚,原因:默认RuntimeException级别才回滚,如果是Eexception级别的异常需要手动添加 @Transactional(rollbackFor

    64330

    Spring 事务管理

    4、如果事务中有的操作没有成功完成,则事务中的所有操作都需要回滚,回到事务执行前的状态。 四大特性(ACID特性) 数据库事务拥有以下四个特性,习惯上被称之为ACID特性。...回滚:ROLLBACK语句结束事务,放弃从开始的一切变更。 3....3.2 PlatformTransactionManager ( 事务管理器 ) PlatformTransactionManager 负责管理事务的开始,提交和回滚。...REQUIRED 支持当前事务,如果没有事务会创建一个新的事务 SUPPORTS 支持当前事务,如果没有事务的话以非事务方式执行 MANDATORY 支持当前事务,如果没有事务抛出异常 REQUIRES_NEW...创建一个新的事务并挂起当前事务 NOT_SUPPORTED 以非事务方式执行,如果当前存在事务则将当前事务挂起 NEVER 以非事务方式进行,如果存在事务则抛出异常 NESTED 如果当前存在事务,则在嵌套事务内执行

    43710

    Spring的事务管理

    JTA(Java Transaction API)事务:与实现无关的,与协议无关的API。可跨多个数据库或多个DAO。 容器事务:应用服务器提供的。 Spring事务核心接口 ?...如果不存在事务,则新启动一个事务 PROPAGATIONRSUPPORTS 当前方法不需要事务上下文。如果存在事务则在事务中运行 PROPAGATIONRMANDATORY 当前方法必须运行在事务中。...如果当前正有一个事务在运行,则会抛异常 PROPAGATIONRNESTED 如果当前存在一个事务,则该方法会在嵌套事务中运行。嵌套的事务可以独立于当前事务进行单独的提交或回滚。...设计事务的注意点:事务不能运行太长时间,否则占用太久资源 事务回滚 运行期异常才回滚,而检查型异常不会回滚 自定义回滚策略 遇到特定的检查型异常时像运行期异常一样回滚。...遇到特定的异常不回滚,即使是运行期异常。

    69030

    spring实现事务管理

    同样,数据没有插入成功,在执行完数据插入之后,如果程序抛异常事务会回滚,也验证了多个bean使用同一个事务代理类实现了事务管理。...数据依然没有插入成功,dao报异常后事务发生了回滚,也说明使用spring事务拦截器实现了事务管理。...数据没有保存成功,dao报异常后事务发生了回滚,也证明我们使用spring编程式事务实现了事务管理。...新增数据失败,dao层抛运行异常后事务发生了回滚,我们使用全注解的方式也实现了spring事务管理。...另外需要注意的是事务默认只捕获运行时异常(非受检异常)然后回滚,对于程序中主动抛出受检异常,程序会终止运行,但是执行完的更新不会回滚。可以根据业务需求和使用习惯自定义配置捕获受检异常后回滚。

    50620

    springboot本地事务

    在以往的单体应用中,我们多个业务操作使用同一条连接操作不同的数据表,一旦有异常, 我们可以很容易的整体回滚; Business:我们具体的业务代码 Storage:库存业务代码;扣库存 Order:...6、PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。 7、PROPAGATION_NESTED:如果当前存在事务,则在嵌套事务内执行。...如果你在 protected、private 或者默认可见性的方法上使用@Transactional 注解,这将被忽略,也不会抛出任何异常。...TransactionDefinition.TIMEOUT_DEFAULT; /** * 是否只读事务 */ boolean readOnly() default false; /** * 用于指定能够触发事务回滚的异常类型...*/ String[] rollbackForClassName() default {}; /** * 用于指定不会触发事务回滚的异常类型 */ Class

    16150

    springboot本地事务

    在以往的单体应用中,我们多个业务操作使用同一条连接操作不同的数据表,一旦有异常, 我们可以很容易的整体回滚; Business:我们具体的业务代码Storage:库存业务代码;扣库存Order:订单业务代码...6、PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。7、PROPAGATION_NESTED:如果当前存在事务,则在嵌套事务内执行。...如果你在 protected、private 或者默认可见性的方法上使用@Transactional 注解,这将被忽略,也不会抛出任何异常。...TransactionDefinition.TIMEOUT_DEFAULT; /** * 是否只读事务 */ boolean readOnly() default false; /** * 用于指定能够触发事务回滚的异常类型...*/ String[] rollbackForClassName() default {}; /** * 用于指定不会触发事务回滚的异常类型 */ Class<?

    23850

    @Transactional注解使用以及事务失效的场景

    在整个事务中,业务代码中所有的数据库连接都应该是同一个连接,不使用该连接的 Sql 是不会被回滚的。...):表示这个事务只读取数据但不更新数据 回滚机制( @Transactional ( rollbackFor = Exception.class ):定义遇到异常时回滚策略 传播机制( @Transactional...,则抛出异常,否则在无事务环境上执行代码 PROPAGATION_NESTED 如果当前存在事务,则在嵌套事务内执行。...RuntimeException,如果出现非 RuntimeException,则 Spring 事务处理不了对应的异常,认为程序是正常的,则不会回滚事务,此时我们可以指定异常类型如 @Transactional...发生最多就是自身调用、异常被吃、异常抛出类型不匹配这三个。由于平时业务繁重,有时候会忽视 @Transactional 注解使用规范,导致事务没有生效或者没有正常回滚,造成较大的数据异常。

    1.9K20

    Spring事务失效场景

    只会在遇到运行时异常RuntimeException或者error时进行回滚,而IOException等检查异常不会影响回滚。...,Spring是否进行回滚是根据你是否抛出异常决定的,所以如果你自己捕获了异常,Spring 也无能为力。...如果一个事务已经存在,则当前事务将被挂起,并创建一个新事务。在当前事务完成之前,不会提交父事务。如果父事务发生异常,则不影响子事务的提交。...NOT_SUPPORTED 如果当前上下文中存在事务,则挂起当前事务,然后新的方法在没有事务的环境中执行。NEVER 如果当前上下文中存在事务,则抛出异常,否则在无事务环境上执行代码。...REQUIRED原理是如果当前有一个事务被添加到一个事务中,如果没有,则创建一个新的事务,父事务和被调用的事务在同一个事务中。即使被调用的异常被捕获,整个事务仍然会被回滚。7.

    42020

    @Transactional事务几点注意及其属性Propagation的使用

    如果加了事务,必须做好开发环境测试(测试环境也尽量触发异常、测试回滚),确保事务生效。 C. 以下列了事务使用过程的注意事项,请大家留意。 1....5.经过在ICORE-CLAIM中测试,效果如下: A.抛出受查异常XXXException,事务会回滚。 B.抛出运行时异常NullPointerException,事务会回滚。...(即上文3点提到的) D.异步任务中,execute直接调用加了@Transactional方法,可以回滚;间接调用,不会回滚。...F.在service中加上@Transactional,如果是action直接调该方法,会回滚,如果是间接调,不会回滚。...,则在transaction状态下执行;如果当前没有transaction,在无transaction状态下执行; MANDATORY:必须在有transaction状态下执行,如果当前没有transaction

    1.4K20

    Spring事务控制:编织代码的魔法丝带

    如果方法执行过程中发生异常,事务将回滚,所有操作都将被撤销。 2. 编程式事务管理 编程式事务管理是通过编写代码来手动管理事务的方式。...在try块中执行业务逻辑,如果出现异常,通过status.setRollbackOnly()来标记事务回滚。 事务的传播行为 事务的传播行为定义了在多个事务方法相互调用时,事务之间的关系。...NESTED NESTED表示如果当前存在事务,则在嵌套事务中执行,如果没有事务,则创建一个新事务。嵌套事务是外部事务的一部分,但可以独立提交或回滚。...Spring事务管理提供了异常回滚的机制,即当事务中的某个方法抛出异常时,整个事务将会回滚,保证数据的一致性。...Exception及其子类异常时事务回滚,noRollbackFor指定了当发生CustomException及其子类异常时事务不回滚。

    21230

    Transactional事物注解(十一)

    }cace(e) } 这样的话,事物就会报错了,因为用的是同一个事物,s2 异常之后,就意味着该事物会回滚; 总结如下: ○ 如果当前有事物,则挂起该事物,并且创建一个新的事物给自己使用 ○...NEVER 非事务执行,如果存在事务,则引发异常 NESTED 如果当前事务存在,则在嵌套事务中执行,否则表现为 REQUIRED 嵌套事物和 REQUIRES_NEW 类似,如果当前存事物,他们都会新建一个事物执行...} 当 s2 异常后,s2 的执行会回滚,但是不会影响 parent 里面的 s1 保存。...总结如下: ○ 如果当前有事务:则开启子事务(嵌套事务),嵌套事务是独立提交或则回滚 ○ 如果当前没有事物,则同 REQUIRED ○ 但是如果主事物提交,则会携带子事物一起提交 ○ 如果主事物回滚...,则子事物会一起回滚,相反,子事物异常,则父事务可以选择回滚还是提交 以上事物传播类型的含义,在源码中有写,翻译成中文就是如上所示的含义。

    63510

    spring自己对AOP的运用 -- spring事物(transaction)原理

    如果事务中有的操作没有成功的完成,则事务中的所有操作都需要回滚,回到事务执行前的状态,同时,该事务对数据库的其他事务执行没有影响。...:执行事务的提交语义 con.rollback();:执行事务的回滚语义 可以控制事务操作 事务demo实例戳这里 java事务处理全解析 - 无知者云 spring中运用事务 spring中最简单的实现只需要直接在要使用事务的类上添加注解...默认配置 PROPAGATION_SUPPORTS:没有事务就什么都不做,有事务则在当前事务中执行 PROPAGATION_MANDATORY:如果没有事务就抛出异常 PROPAGATION_REQUIRES_NEW...:如果有事务就抛出异常 PROPAGATION_NESTED:如果已经有一个事务,就再嵌套一个执行,被嵌套的事务可以独立于封装事务进行提交或者回滚,如果不存在事务,则新建事务 这里就注意到 所谓 物理事务...对事务的隔离机制 TRANSACTION_READ_UNCOMMITTED :在一个事务中一行数据的改变,再实际提交之前,会被另一个事务读到,也就是说如果改变数据的事务发生回滚,那么其它线程读到的数据就是无效的

    76910

    C# Command命令(行为型模式)+队列 实现事务,带异步命令重试机制和生命周期

    ok,上面的硬编码可以很好的完成需求,但是如果中间发生异常,上的代码将无法支持撤销和回滚.注:这里假设持久化到文档和持久化到日志是一个事务操作(即他们两个必须同时成功,这个操作才算完成,否则就需要回滚)...如果我们传入的批量操作Sql(一般只用于增删改,查可以忽略)中有一个发生异常,那么我们就可以调用Dispose方法(释放资源)和Rollback方法,来对事务进行回滚.但是我们上面中的示例明显不支持,所以这个时候我们就需要引入...Command命令模式,将两个操作合并为一个操作.在进行最终的提交,失败则回滚,如果涉及非托管资源,不论成功如否都需要释放资源.所以升级代码如下: /// /// 设计模式之...,记录开始回滚!")...这里在提一点,如果需要实现多个命令组成一个复合命令,可以使用Composite组合模式将多个命令组成一个复合命令,来实现.后续的随笔中我会介绍.

    1.1K10

    JDBC 处理事务(11)

    当在一个事务中执行多个操作时,要么所有的事务都被提交(commit),要么整个事务回滚(rollback)到最初状态 3)当一个连接对象被创建时,默认情况下是自动提交事务:每次执行一个SQL语句时,如果执行成功...,就会向数据库自动提交,而不能回滚 4)为了让多个SQL语句作为一个事务执行: - 调用Connection对象的setAutoCommit(false);以取消自动提交事务 - 在所有的SQL语句都成功执行后...,调用commit()方法提交事务 - 在出现异常时,调用rollback()方法回滚事务 举个例子 public class JDBCTest04 { /** * 违反事务一致性...如果多个操作,每个操作使用的是自己的单独的连接,则无法保证事务 * 2....,则提交:connection.commit(); * 3)回滚事务:若出现异常,则在catch块中回滚事务 */ public void testTransaction01

    28010
    领券