抛出异常后,methodA 使用 try-catch 语句 catch 了异常(如下代码),并没有向外抛出,那么这时会发生什么?...在执行 methodB 前由于 methodB 事务传播性为 REQUIRES_NEW,所以会先挂起 methodA 开启的事务 1,然后开启自己的事务 2,再执行 methodB。...methodA 执行代码 1.2 调用 methodB 时,由于 methodB 的传播性为 NOT_SUPPORTED,所以会挂起外层 methodA 开启的事务,然后 methodB 以非事务方式运行...,运行完毕后,在恢复 methodA 的事务的执行,最后提交事务,这个过程可以使用下面流程图来描述:5.PROPAGATION_NEVER这个传播行为不支持事务。...在日常开发环境中,我们最常用到的事务传播行为只有两种,一是 REQUIRED,二是 REQUIRES_NEW。
在Spring中使用事务 Spring事务支持两种方式,编程式事务和声明式事务,下面的例子使用声明式事务,即@Transactional注解的方式 @Transactional注解应用到public方法...空数组{} @Transactional的其他属性都比较容易理解,详细分析一下事务的传播行为 Spring事务的传播行为 Spring事务的传播行为在Propagation枚举类中定义了如下几种选择...如果当前没有事务,则抛出异常 不支持当前事务 REQUIRES_NEW :创建一个新事务,如果当前存在事务,则把当前事务挂起 NOT_SUPPORTED :以非事务方式运行,如果当前存在事务,则把当前事务挂起...是创建新的事务运行,因此addUser和addLocation是2个独立的事务 NOT_SUPPORTED 以非事务方式运行,如果当前存在事务,则把当前事务挂起 当前没有事务 // 没有注解 addUser...嵌套事务是外部事务的一部分, 只有外部事务正常提交它才会被提交。使用NESTED 有限制,它只支持 JDBC,且数据库要支持 savepoint 保存点,还要 JDBC 的驱动在3.0以上
错误使用传播机制Spring事务的传播机制是指在多个事务方法相互调用时,确定事务应该如何传播的策略。...Spring提供了七种事务传播机制:REQUIRED、SUPPORTS、MANDATORY、REQUIRES_NEW、NOT_SUPPORTED、NEVER、NESTED。...(address); }}复制代码在上面的例子中,如果用户插入失败,不会导致saveAddress()回滚,因为这里使用的传播是REQUIRES_NEW,传播机制REQUIRES_NEW的原理是如果当前方法中没有事务...如果一个事务已经存在,则当前事务将被挂起,并创建一个新事务。在当前事务完成之前,不会提交父事务。如果父事务发生异常,则不影响子事务的提交。...REQUIRES_NEW 每次都会新建一个事务,并且同时将上下文中的事务挂起,执行当前新建事务完成以后,上下文事务恢复再执行。
当前方法及关联方法都有事务呢,或者只是其中某几个有事务,该用谁的呢? 概念: 事务的传播行为:一个方法运行在一个开启了事务的方法上时,当前方法是使用原来的事务还是开启一个新的事务。...如果方法在一个事务中被调用,该事务会被挂起,在方法调用结束后,原先的事务便会恢复执行。...因为我们的付款过程是 使用循环 购买的,你说我们会买到一本还是一本都买不到呢?...REQUIRES_NEW: 不管是否存在事务,业务方法总会为自己发起一个新的事务。...insert数据(针对的insert操作) A 读取 学生表 中一部分数据 B 向学生表中插入了 新的数据 A 读取 学生表时 多出了一些行 3.2 数据库隔离性 数据库事务的隔离性: 数据库系统必须具有隔离并发运行各个事务的能力
不可重复读问题,强调的是某一条数据的内容在“我”两次读取间,发生了改变。(因为 update 语句) 幻读问题,强调的整个数据的数据总量,在“我”两次读取间,发生了改变。...(因为 insert / delete 语句) 幻读问题 造成的危害要小于 不可重复读问题。 3. 四个隔离级别 隔离级别表示:「当“我”操作这张表时,“其他人”对这张表还有多大的操作权限」 。...传播机制 传播行为 含义 备注 REQUIRED 当方法调用时,如果不存在当前事务,那么就创建事务;如果之前已经存在了事物,那么就沿用之前的事务。...NOT_SUPPORTED 不支持事务,不存在当前事务也不会创建新事务;如果存在当前事务则挂起它,直到方法结束后才恢复当前事务 适用于那些不支持事务的数据库和SQL语句 NEVER 不支持事务。...REQUIRES_NEW 的高级版 支持当前事务中使用保存点(savepoint),可以回滚到保存点;如果当前事务没有保存点,则完全等价于 REQUIRES_NEW 毫无疑问,最常用的是 REQUIRED
所以我们不需要任何配置就可以使用@Transactional注解来进行事务的使用。我习惯使用jdbc,虽然Jpa有各种各样的优点(真的不太会用)。...不可重复读:与脏读逻辑类似,一个事务读取到另一个事务已提交的 update数据,导致两次读取数据 值不一致。...幻读:与不可重复度逻辑类似,一个事务读取到另一个事务已提交的 insert数据,导致两次读取数据 条数 不一致。 为解决上述情况,我们可以进行事务隔离级别的设置。...传播行为中定义了传播范围、触发节点、是否沿用当前事务、是否挂起现有事务、或者在被调用时无事务则失败等等。...IllegalTransactionStateException) REQUIRES_NEW:新建事务,当前存在事务,就挂起当前事务; NOT_SUPPORTED:非事务方式运行,如当前存在事务,就挂起当前事务
调用深度较深,并且有多处使用到了事务,其中BasePlatformUserService.insert这个方法用到了Propagation.REQUIRES_NEW,也就是图中最右边的这个链路中最终插入了一个...REQUIRED_NEW:从字面即可知道,new,每次都要一个新事务,该传播级别的特点是,每次都会新建一个事务,并且同时将上下文中的事务挂起,执行当前新建事务完成以后,上下文事务恢复再执行。...如果没有对审计方法使用 REQUIRES_NEW 属性,审计记录就会连同尝试执行的交易一起回滚。...开启的新事务中开启的新Session插入的记录并没有打破老Session缓存的查询结果,因此在老Session中使用相同的查询语句是查询不到真实记录的 具体的debug日志如下: ?...REQUIRES_NEW这个传播行为的理解就更深刻了。
通过了解这些事务传播行为,开发者可以更好地掌握Spring事务管理的核心原理,并在实际开发中合理地使用事务传播行为来保证事务的正确性和一致性。...并且将详细介绍两种常用传播行为REQUIRED和REQUIRES_NEW的不同。...在需要更细粒度的控制事务传播时,可以考虑使用其他的传播行为。...REQUIRED和REQUIRES_NEW案例演示虽然事务有七种事务传播行为,但是在开发中比较常用的主要是REQUIRED和REQUIRES_NEW这两种,接下来就开始讲解这两种不同传播行为在实际开发中的应用场景...signLogService保存用户id1233成功lotteryService保存主题SDEF失败第二种:不同事务代理类 + REQUIRES_NEW第二种方式就是使用REQUIRES_NEW传播属性
6 声明式事务 6.1 Spring中事务的使用 在进行数据操作事,通常会将多条SQL语句作为整体进行操作,这一条或者多条SQL语句就称为数据库事务。...6.3 Spring的事务隔离级别与传播性 隔离级别 隔离性(Isolation)作为事务特性的一个关键特性,它要求每个读写事务的对象对其他事务的操作对象能相互分离,即该事务提交前对其他事务都不可见,在数据库层面都是使用锁来实现...传播行为 在Spring中,当一个方法调用另外一个方法时,可以让事务采取不同的策略工作,如新建事务或者挂起当前事务等,这便是事务的传播行为。...而不回滚当前方法的事务 */ NESTED(6); } 日常开发中基本只会使用到REQUIRED(0),REQUIRES_NEW(3),NESTED(6)三种。...NESTED和REQUIRES_NEW是有区别的。NESTED传播行为会沿用当前事务的隔离级别和锁等特性,而REQUIRES_NEW则可以拥有自己独立的隔离级别和锁等特性。
得到如下结果 答案: 发生了回滚,无法插入成功 看到这个答案,可能有些朋友会一脸懵逼,为啥上个例子把异常捕获了,数据可以插入成功,这次也是同样把异常捕获,数据却无法插入成功 原因: 这就得从spring事务的传播行为说起了...,spring事务的默认传播行为是REQUIRED。...如果一个事务已经存在,则先将这个存在的事务挂起 场景二:接着上一场景的延伸 01 示例:在方法上加了Propagation.REQUIRES_NEW注解 @Autowired private JdbcTemplate...jdbcTemplate; private String addSql = "INSERT INTO tx_test (tx_id) VALUES (?)...REQUIRES_NEW,saveTxTestD和saveTxTestB确实是不同事务,saveTxTestD回滚,确实影响不了saveTxTestB。
Spring 事务 在使用 Spring 进行开发过程中,一般都会使用 Spring 来进行事务的控制,接下来就来看下 Spring 使用事务的详细过程,包括事务的传播方式等。...类名数组 不需要回滚的异常类名 空数组 {} 事务的名称就是方法的全限定名,无法设置 事务的传播方式 接下来看下事务的传播方式,事务的传播方式在 Spring 事务中非常重要,需要理解清楚,否则有时候事务不回滚不知道问题出在哪里...事务的传播方式使用 propagation 属性来表示,它是一个枚举类型,共有 7 个,即事务的传播方式有 7 种: 1public enum Propagation { 2 REQUIRED...//required:需要事务,如果事务不存在,则创建一个新事务 3 REQUIRES_NEW //required_new:需要创建一个新事务,如果已存在事务,则把当前事务挂起 4...REQUIRES_NEW ·required_new·,需要创建一个新事务,如果已存在事务,则把当前事务挂起 在 addUser 方法加上注解 @Transactional(propagation =
在这里插入图片描述] 答案: 发生了回滚,无法插入成功 看到这个答案,可能有些朋友会一脸懵逼,为啥上个例子把异常捕获了,数据可以插入成功,这次也是同样把异常捕获,数据却无法插入成功 原因: 这就得从spring事务的传播行为说起了...,spring事务的默认传播行为是REQUIRED。...如果一个事务已经存在,则先将这个存在的事务挂起 场景二:接着上一场景的延伸 示例:在方法上加了Propagation.REQUIRES_NEW注解 @Autowired private JdbcTemplate...jdbcTemplate; private String addSql = "INSERT INTO tx_test (tx_id) VALUES (?)...REQUIRES_NEW,saveTxTestD和saveTxTestB确实是不同事务,saveTxTestD回滚,确实影响不了saveTxTestB。
这篇文章与上一篇文章有强关联,建议先去看上篇 一、事务回滚 我们只分析常用的传播属性REQUIRED(默认)、REQUIRES_NEW、NESTED,其他的可以自行阅读,也比较简单。....第二个传播属性为REQUIRES_NEW,第二个业务方法抛异常即queryUesr 4.第二个传播属性为NESTED,第二个业务方法抛异常即queryUesr 第一个方法是UserService对象,...传播属性 上面文章已经分析过了,这种情况的事务创建时第二个事务会将第一个事务挂起,第二个事务的newTransaction=true,但是第二个事务的connection和第一个事务的connection...二、事务提交 事务提交分下面几种情况分析,其实理解了事务的回滚,再看事务的提交会更加的简单 1.第二个传播属性为REQUIRED 2.第二个传播属性为REQUIRES_NEW 3.第二个传播属性为NESTED...2.第二个传播属性为REQUIRES_NEW 这种情况第一个事务和第二个事务的连接不同,并且第一个事务被挂起了,第二个事务的newTransaction=true。
毫无疑问,在试图执行 SQL 语句时,您会得到一个异常,告诉您该连接是一个只读连接。 关于只读标志很奇怪的一点是:要使用它,必须启动一个事务。如果只是读取数据,需要事务吗?答案是根本不需要。...REQUIRES_NEW 事务属性总是会在启动方法时启动一个新的事务。许多开发人员都错误地使用 REQUIRES_NEW 属性,认为它是确保事务启动的正确方法。...使用 REQUIRES_NEW 事务属性时,如果存在现有事务上下文,当前的事务会被挂起并启动一个新事务。方法结束后,新的事务被提交,原来的事务继续执行。...如果没有对审计方法使用 REQUIRES_NEW 属性,审计记录就会连同尝试执行的交易一起回滚。使用 REQUIRES_NEW 属性可以确保不管初始事务的结果如何,审计数据都会被保存。...这里要注意的一点是,要始终使用 MANDATORY 或 REQUIRED 属性,而不是 REQUIRES_NEW,除非您有足够的理由来使用它,类似审计示例中的那些理由。
("INSERT into t1 values ('m2')"); } } 如何配置事务传播行为?...MANDATORY 使用当前的事务,如果当前事务管理器中没有事务,就抛出异常。 REQUIRES_NEW 新建事务,如果当前事务管理器中存在事务,把当前事务挂起,然后会新建一个事务。...3、Spring事务管理器中的Connection和业务中操作db的Connection如何使用同一个的?...) public void requires_new(String name) { this.jdbcTemplate.update("insert into user1(name) VALUES..., name); } User2Service 添加2个方法,事务传播行为:REQUIRES_NEW,注意第2个方法内部最后一行会抛出一个异常。
= obj.startShelve(); if(result){ obj.shelveOperation(); } } // 该方法开启事务,传播属性为REQUIRES_NEW...new Operation(); …… ope.setStatus(status);//status 为操作结果,成功或失败 3 opeDao.update...标注为开启事务的方法传播机制默认为“REQUIRED”,而startShelve()方法则为REQUIRES_NEW。...如果没有一个活动的事务,则抛出异常。 REQUIRES_NEW 总是开启一个新的事务。如果一个事务已经存在,则将这个存在的事务挂起。...NOT_SUPPORTED 总是非事务地执行,并挂起任何存在的事务。
事务的传播机制 所谓事务的传播行为是指,如果在开始当前事务之前,一个事务上下文已经存在,此时有若干选项可以指定一个事务性方法的执行行为。...(,默认)REQUIRED :如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。 SUPPORTS :如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。...REQUIRES_NEW :创建一个新的事务,如果当前存在事务,则把当前事务挂起。 NOT_SUPPORTED :以非事务方式运行,如果当前存在事务,则把当前事务挂起。...指定方法:通过使用 propagation 属性设置,例如: @Transactional(propagation = Propagation.REQUIRED) package org.springframework.transaction.annotation...public enum Propagation { REQUIRED(0), SUPPORTS(1), MANDATORY(2), REQUIRES_NEW
如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常 REQUIRES_NEW 创建一个新的事务,如果当前存在事务,则把当前事务挂起 NOT_SUPPORTED 以非事务方式运行,如果当前存在事务...5.2.2 REQUIRES_NEW REQUIRES_NEW 表示创建一个新的事务,如果当前存在事务,则把当前事务挂起。...但是,大家注意松哥上面的加粗,在 REQUIRES_NEW 中可能会同时存在两个事务,外部方法的事务被挂起,内部方法的事务独自运行,而在 REQUIRED 中则不会出现这种情况,如果内外部方法传播性都是...还是上面那个例子,假设 handle1 和 handle2 方法都有事务,handle2 方法的事务传播性是 REQUIRED,而 handle1 方法的事务传播性是 REQUIRES_NEW,那么最终打印出来的事务日志如下...松哥再来简单总结下(假设 handle1 方法的事务传播性是 REQUIRES_NEW): 如果 handle2 方法没有事务,handle1 方法自己开启一个事务自己玩。
要解决这个问题,就需要了解事务的传播行为了。...这是最常见的选择。PROPAGATION_SUPPORTS支持当前事务,如果当前没有事务,就以非事务方式执行。PROPAGATION_MANDATORY使用当前的事务,如果当前没有事务,就抛出异常。...); ...... } 接下来我们通过对其中三种最常用的(REQUIRED、REQUIRES_NEW、NESTED)策略进行对比来更深入的理解。...REQUIRES_NEW 当内部方法的传播行为设置为 REQUIRES_NEW 时,内部方法会先将外部方法的事务挂起,然后开启一个新的事务 。...当内部方法的传播行为设置为 NESTED 时,内部方法会开启一个新的嵌套事务(子事务)。
领取专属 10元无门槛券
手把手带您无忧上云