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

每日一博 - 常见的Spring事务失效&事务不回滚案例集锦

方法用final修饰 未被spring管理 多线程调用 表不支持事务 未开启事务 事务不回滚 错误的传播特性 自己吞了异常 手动抛了别的异常 自定义了回滚异常 嵌套事务回滚多了 其他常见问题 编程式事务...为什么? spring事务底层使用了aop,也就是通过jdk动态代理或者cglib,帮我们生成了代理类,在代理类中实现的事务功能。...myisam不支持事务。myisam还不支持行锁和外键。 建议我们在开发的过程中,发现某张表的事务一直都没有生效,那不一定是spring事务的锅,最好确认一下你使用的那张表,是否支持事务。...这样就能保证,如果内部嵌套事务中出现异常,只回滚内部事务,而不影响外部事务。...相较于@Transactional注解声明式事务更建议大家使用,基于TransactionTemplate的编程式事务。主要原因如下: 避免由于spring aop问题,导致事务失效的问题。

1.2K10

聊聊spring事务失效的12种场景,太坑了

大家好,是悟空呀,这篇比较硬核,推荐收藏起来慢慢看~ 前言 对于从事java开发工作的同学来说,spring的事务肯定再熟悉不过了。...但如果需要跨多张表操作,由于其不支持事务,数据极有可能会出现不完整的情况。 此外,myisam还不支持行锁和外键。 所以在实际业务场景中,myisam使用的并不多。...NESTED 如果当前上下文中存在事务,则嵌套事务执行,如果不存在事务,则新建事务。...Propagation.NEVER,这种类型的传播特性不支持事务,如果有事务则会抛异常。...关于大事务问题的危害,可以阅读一下的另一篇文章《让人头痛的大事务问题到底要如何解决?》,上面有详细的讲解。

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

聊聊spring事务失效的12种场景,太坑了

什么? 如果你看过spring事务的源码,可能会知道spring事务底层使用了aop,也就是通过jdk动态代理或者cglib,帮我们生成了代理类,在代理类中实现的事务功能。...但如果需要跨多张表操作,由于其不支持事务,数据极有可能会出现不完整的情况。 此外,myisam还不支持行锁和外键。 所以在实际业务场景中,myisam使用的并不多。...NESTED 如果当前上下文中存在事务,则嵌套事务执行,如果不存在事务,则新建事务。...Propagation.NEVER,这种类型的传播特性不支持事务,如果有事务则会抛异常。...关于大事务问题的危害,可以阅读一下的另一篇文章《让人头痛的大事务问题到底要如何解决?》,上面有详细的讲解。

35940

聊聊spring事务失效的12种场景,太坑了

什么? 如果你看过spring事务的源码,可能会知道spring事务底层使用了aop,也就是通过jdk动态代理或者cglib,帮我们生成了代理类,在代理类中实现的事务功能。...但如果需要跨多张表操作,由于其不支持事务,数据极有可能会出现不完整的情况。 此外,myisam还不支持行锁和外键。 所以在实际业务场景中,myisam使用的并不多。...NESTED 如果当前上下文中存在事务,则嵌套事务执行,如果不存在事务,则新建事务。...Propagation.NEVER,这种类型的传播特性不支持事务,如果有事务则会抛异常。...关于大事务问题的危害,可以阅读一下的另一篇文章《让人头痛的大事务问题到底要如何解决?》,上面有详细的讲解。

6.3K22

聊聊Spring事务失效的12种场景,太坑了!

什么? 如果你看过spring事务的源码,可能会知道spring事务底层使用了aop,也就是通过jdk动态代理或者cglib,帮我们生成了代理类,在代理类中实现的事务功能。...但如果需要跨多张表操作,由于其不支持事务,数据极有可能会出现不完整的情况。 此外,myisam还不支持行锁和外键。 所以在实际业务场景中,myisam使用的并不多。...NESTED 如果当前上下文中存在事务,则嵌套事务执行,如果不存在事务,则新建事务。...Propagation.NEVER,这种类型的传播特性不支持事务,如果有事务则会抛异常。...关于大事务问题的危害,可以阅读一下的另一篇文章《让人头痛的大事务问题到底要如何解决?》,上面有详细的讲解。

37720

@Transactional 注解的12种失效场景,这坑踩个遍

什么? 如果你看过spring事务的源码,可能会知道spring事务底层使用了aop,也就是通过jdk动态代理或者cglib,帮我们生成了代理类,在代理类中实现的事务功能。...但如果需要跨多张表操作,由于其不支持事务,数据极有可能会出现不完整的情况。 此外,myisam还不支持行锁和外键。 所以在实际业务场景中,myisam使用的并不多。...NESTED 如果当前上下文中存在事务,则嵌套事务执行,如果不存在事务,则新建事务。...Propagation.NEVER,这种类型的传播特性不支持事务,如果有事务则会抛异常。...这样就能保证,如果内部嵌套事务中出现异常,只回滚内部事务,而不影响外部事务。 三 其他 1 大事务问题 在使用spring事务时,有个让人非常头疼的问题,就是大事务问题。

2.4K44

鸡肋的Redis事务

没错,Redis也有事务管理,但是功能很简单,在正式开发中也并不推荐使用。但是面试中有可能会问到,所以本文简单谈一谈Redis的事务。 通过这篇文章,你会了解 Redis为什么要提供事务?...Redis事务基本指令和使用方法 CAS乐观锁是什么? Redis事务什么不支持回滚? 1. 为什么要用事务 我们知道Redis的单个命令是原子性的,比如get、set、mget、mset等指令。...(提交事务) 127.0.0.1:6379(TX)> EXEC 1) (integer) 110 2) (integer) 90 2.2.2 嵌套事务 Redis不支持嵌套事务,多个MULTI命令和单个...Redis事务什么不支持回滚 引自Redis官方文档。 官方甩锅说辞 为了方便大家理解,翻译一下就是: 你们程序员的锅,关我们Redis屁事儿!...而且不支持回滚可以使他们有更多时间玩儿Redis运行得更简单快捷。 这种说法多牛!如果出问题就是程序员的问题,写错了还让代码进入生产环境,那就是罪上加罪,你永远赖不着Redis官方。

29810

Spring事务失效的12种场景

但如果需要跨多张表操作,由于其不支持事务,数据极有可能会出现不完整的情况。 此外,myisam还不支持行锁和外键。 所以在实际业务场景中,myisam使用的并不多。...7.未开启事务 有时候,事务没有生效的根本原因是没有开启事务。 你看到这句话可能会觉得好笑。 开启事务不是一个项目中,最最最基本的功能吗? 为什么还会没有开启事务?...NESTED 如果当前上下文中存在事务,则嵌套事务执行,如果不存在事务,则新建事务。...Propagation.NEVER,这种类型的传播特性不支持事务,如果有事务则会抛异常。...相较于@Transactional注解声明式事务更建议大家使用,基于TransactionTemplate的编程式事务。主要原因如下: 避免由于spring aop问题,导致事务失效的问题。

37220

注意Spring事务这一点,避免出现大事务

rpc,嵌套一些非DB的操作,一般情况下这么写的确也没什么问题,一旦非DB写操作出现比较慢,或者流量比较大,就会出现大事务的问题。...这里有三种方案可以进行优化: 将非DB操作提到事务之外,这种方法也就是我们上面最原始的方法,对于一些简单的逻辑可以提取,但是对于一些复杂的逻辑,比如事务嵌套嵌套里面调用了afterCompletion...再谈大事务 说了这么久大事务,到底什么才是大事务呢?简单点就是事务时间运行得长,那么就是大事务。...,直接在这个方法加上事务注解,然后再往里面补充,哪管他是什么逻辑,一把梭。...当然还有些人是想搞什么分布式事务,可惜用错了方法,对于分布式事务可以关注Seata,同样可以用一个注解就能帮助你做到分布式事务。 最后 其实最后想想,为什么会出现这种问题呢?

2.9K30

Spring5源码之Spring七种传播特性的详解

这就是影响的回滚了,如果ServiceA报错了,ServiceB是不会受到影响的,ServiceB报错了,ServiceA也可以选择性的回滚或者是提交。...解释: 不能被一个事务来调用,ServiceA.method开事务了,但是调用了ServiceB会报错 PROPAGATION_NESTED 嵌套事务,如果当前事务存在,那么在嵌套事务中执行。...如果当前事务不存在,则表现跟REQUIRED一样。解释: 开启嵌套事务,ServiceB开启一个子事务,如果回滚的话,那么ServiceB就回滚到开启子事务的这个save point。...当前存在事务的情况下: 在之前的文章 Spring事务增强器 二,一篇文章让你彻底搞懂Spring事务 中已经讲过,第一次事务开始时必会新创一个holder然后绑定操作,此时线程变量是由holder...NERVER 不支持当前事务;如果当前事务存在,则抛出异常 // 1.

11320

架构取经之路3 - 悟空聊无事务

悟空:福袋没发出来,那为什么订单状态还一直是已支付?你这小儿,可不要瞒! 小黑熊:大圣,我们数据库用的是MongoDB 3.0,不支持事务啊。 悟空:你说的事务什么意思?...四、那如何优化无事务的代码? 由于MongoDB 3.0 不支持事务,所以很有可能出现数据不一致的情况(订单已支付,福袋未发送)。 那我们既然不能享受到事务的一致性,有什么办法来优化这部分代码呢?...优点:前四步的业务逻辑处理任意一步如果出错了,并不会影响数据库的记录 缺点:后三步的保存如果出错了,和最开始的方案一样,存在数据不一致的问题。 那如何进行解决这种问题? 五、如何解决无事务的问题?...分别有什么优点和缺点?怎么优化? 问题3.如果第三步更新库存失败,那又该怎么呢? 问题4.如何退款失败,那又该怎么呢? 围绕上面几个问题,我们展开来论述。...那有什么问题呢?对于秒杀活动,队列retry肯定不可行。 那我们可以一次补偿操作吗?(发起退款,更新订单状态为失败。) 答案是可以的。

47520

故事|黑熊精 揭秘「补偿事务

悟空:福袋没发出来,那为什么订单状态还一直是已支付?你这小儿,可不要瞒! 小黑熊:大圣,我们数据库用的是 MongoDB 3.0,不支持事务啊。 悟空:你说的事务什么意思?...四、那如何优化无事务的代码? 由于MongoDB 3.0 不支持事务,所以很有可能出现数据不一致的情况(订单已支付,福袋未发送)。 那我们既然不能享受到事务的一致性,有什么办法来优化这部分代码呢?...优点:前四步的业务逻辑处理任意一步如果出错了,并不会影响数据库的记录 缺点:后三步的保存如果出错了,和最开始的方案一样,存在数据不一致的问题。 那如何进行解决这种问题? 五、如何解决无事务的问题?...分别有什么优点和缺点?怎么优化? 问题 3:如果第三步更新库存失败,那又该怎么呢? 问题 4:如何退款失败,那又该怎么呢? 围绕上面几个问题,我们展开来论述。...那有什么问题呢?对于秒杀活动,队列retry肯定不可行。 那我们可以一次补偿操作吗?(发起退款,更新订单状态为失败。) 答案是可以的。

43220

你知道吗?使用ES的坑

解决完问题后,关注的是另一个问题:按理说,如果新增数据报错了,列表数据应该也是没有的,这里第2步中会多出这么几条数据?...如上图,在新增卡片时,先做了数据库的插入,然后ES的插入,最后做事件的通知及其他操作。看着好像也没什么问题。 等等,不对,为什么这里没做事务管理?如果有事务,失败了不就会回滚么?...正常情况下,只要在类上添加@Transactional注解就完事了,那是什么原因导致注解失效了呢?问问ChatGPT吧,回复如下: 看着也没什么问题,这些情况都不符合的场景。那问题出在哪里呢?...在Bing上搜索了一阵子,发现在别人的文章中有提到@Transactional失效中的原因有一条:如果数据库引擎不支持事务,那么就无法回滚对应的数据。 隐约记得ES是不支持事务的,会是这个问题么?...但是由于ES不支持事务,所以@Transactional也没办法回滚,所以列表中的数据还是能被查看到(第2步,ES中的数据还是在的),但是点击详情(第3步)时,因为在数据库中找不到对应的数据,所以页面无法显示

47130

事务一致性测试

解决完问题后,关注的是另一个问题:按理说,如果新增数据报错了,列表数据应该也是没有的,这里第2步中会多出这么几条数据?...如上图,在新增卡片时,先做了数据库的插入,然后ES的插入,最后做事件的通知及其他操作。看着好像也没什么问题。 等等,不对,为什么这里没做事务管理?如果有事务,失败了不就会回滚么?...正常情况下,只要在类上添加@Transactional注解就完事了,那是什么原因导致注解失效了呢?问问ChatGPT吧,回复如下: 看着也没什么问题,这些情况都不符合的场景。那问题出在哪里呢?...在Bing上搜索了一阵子,发现在别人的文章中有提到@Transactional失效中的原因有一条:如果数据库引擎不支持事务,那么就无法回滚对应的数据。 隐约记得ES是不支持事务的,会是这个问题么?...但是由于ES不支持事务,所以@Transactional也没办法回滚,所以列表中的数据还是能被查看到(第2步,ES中的数据还是在的),但是点击详情(第3步)时,因为在数据库中找不到对应的数据,所以页面无法显示

22920

数据库中间件TDDL调研笔记

二,TDDL不支持什么SQL 不支持各类join 不支持多表查询 不支持between/and 不支持not(除了支持not like) 不支持comment,即注释 不支持for update 不支持...三,TDDL支持什么SQL 支持CURD基本语法 支持as 支持表名限定,即"table_name.column" 支持like/not like 支持limit,即mysql的分页语法 支持in 支持嵌套查询...,由于不支持多表,只支持单表的嵌套查询 画外音:分布式数据库中间件,支持的语法都很有限,但对于与联网的大数据/高并发应用,足够了,服务层应该做更多的事情。...,不支持夸库事务 支持多库多表分页查询,但会随着翻页,性能降低 画外音:可以看到,其实TDDL很多东西都不支持,那么为什么它还如此流行呢?...13年底的调研笔记,文中的“画外音”是当时的批注,希望能让大家对TDDL能有一个初步的认识,有疑问之处,欢迎交流。

2.2K90

面试突击87:说一下 Spring 事务传播机制?

以上 7 种传播机制,可根据“是否支持当前事务”的维度分为以下 3 类: 图片 看到这里,有人可能会说:说了这么多,也看不懂啊,即使看懂了,也记不住啊?这要咋整?...最后一种是嵌套事务 Propagation.NESTED,它属于懂事型女友,如果有房子了就以房子为基础点小生意,卖个花生、水果啥的,如果买卖成了,那就继续发展;如果失败了,至少还有房子;如果没房子也没关系...事务传播机制使用与演示 接下来我们演示一下事务传播机制的使用,以下面 3 个最典型的事务传播级别为例: 支持当前事务的 REQUIRED; 不支持当前事务的 REQUIRES_NEW; 嵌套事务 NESTED...REQUIRED_NEW 使用演示 REQUIRED_NEW 不支持当前事务。...事务的传播级别有 7 个,支持当前事务的:REQUIRED、SUPPORTS、MANDATORY;不支持当前事务的:REQUIRES_NEW、NOT_SUPPORTED、NEVER,以及嵌套事务 NESTED

31210

MySQL 中 MyISAM 中的查询为什么比 InnoDB 快?

比如:有让出题的,有让推荐资料的,还有让推荐公司的。。。 真是太难为了!也有些人刚开过年,任务不算多。所以,经常酱油,不知道该学习什么? 于是,发了一套面试题,如下: ?...哎,伸手党可不好,什么时候才能独立呢?所以,一一的拒绝了他们。 关于这套面试题,有很多内容,都写过文章的!今天,我们来写一写第 14 小题。为什么 MyisAM 查询快? ?...上面的“事务”写错了。不过,相信大家能看明白其中的解释。 关于“行锁”还是“表锁”,可以看我的这篇文章《InnoDB 的 select 行锁还是表锁》。...这是一个随着事务的创建而不断增长的数字。每个事务事务开始时会记录它自己的系统版本号。每个查询必须去检查每行数据的版本号与事务的版本号是否相同。...说白了,为什么现在一些人喜欢 NoSQL 呢?因为 nosql 本身似乎应该是以省去解析和事务锁的方式来提升效能。MYISAM 不支持事务,也是它查询快的一个原因!

9.6K51

Spring声明式与编程式事务的区别,事务与非事务方法相互调用导致的事务不生效问题

如果没有一个活动的事务,则抛出异常。 4 NESTED 如果一个活动的事务存在,则运行在一个嵌套事务中。...又是不支持事务的 alter table table_name engine=myisam; 这样就会出现 “事务失效” 的问题了 「解决方案」:修改存储引擎为 Innodb。...问题三:同一个类方法自调用 在一个Service内部,事务方法之间的嵌套调用,普通方法和事务方法之间的嵌套调用,都不会开启新的事务.是因为spring采用动态代理机制来实现事务控制,而动态代理最终都是要调用原始对象的...如果你看过之前的源码分析的文章应该知道,在处理回滚时有这么一段代码 rollBackOnly 设置 在提交时又做了下面这个判断(这个方法删掉了一些不重要的代码) commit_rollbackOnly...「解决方案」: 这个解决方案要依赖业务而定,你要明确你想要的结果是什么 内部事务发生异常,外部事务 catch 异常后,内部事务自行回滚,不影响外部事务 ❝ 将内部事务的传播级别设置为 nested

1.1K41
领券