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

Spring数据库事务典型错误用法剖析

错误使用Service 互联网往往采用模型—视图—控制器(Model View Controller,MVC)来搭建开发环境,因此Controller中使用Service是十分常见的。...图1  事务中的文件操作 从图1可以看出,当操作文件这步占用较长时间,数据库事务将长期得不到释放,这个时候如果发生高并发的情况,会造成大量的并发请求得不到数据库的事务资源而导致的系统宕机。...图2  不在事务中的文件操作 从图2可以看出,操作文件事务早已被关闭了,这时操作文件就避免了数据库事务资源被当前请求占用,从而导致其他请求得不到事务的情况发生了。...错误捕捉异常 模拟一段购买商品的代码,其中ProductService是产品服务类,而TransactionService是记录交易信息,需求显然就是产品减库存保存交易同一个事务里面,要么同时成功,...这样发生异常,会更有利于定位,这才是合适使用数据库事务的方式。

18830

拜托,不要在问我@Transactional注解了

前言 一个阳光明媚的周五,正开心的敲着代码,突然看到一个技术交流群中正在火热的讨论着某个话题,好奇心驱使着点开看了一下, 原来是某位同僚正在远程面试,面试官出了这样的一道题 ?...在这里插入图片描述 对此还有另一种解释:Controller中所依赖的Service其实是IOC提供的一个代理对象,而这个代理对象调用具体的方法,会通过判断该方法上面是否包含@Transactional...) checkedExceptionAndRollBack:没有添加记录,事务回滚 “ 抛出检查异常事务不会回滚 ” “ 抛出检查异常事务不会生效 ” ,这是两个不同的概念,事务有没有生效是由IOC...// 返回表中的所有数据 return studentMapper.selectList(new QueryWrapper()); } } 执行结果:可以看到同一个事务中执行全表更新更新了...并且有3条数据没有被更新,这些没有没更新的行一般被称为幻影行 ?

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

Spring数据库事务典型错误用法剖析

错误使用Service 互联网往往采用模型—视图—控制器(Model View Controller,MVC)来搭建开发环境,因此Controller中使用Service是十分常见的。...图2 不在事务中的文件操作 从图2可以看出,操作文件事务早已被关闭了,这时操作文件就避免了数据库事务资源被当前请求占用,从而导致其他请求得不到事务的情况发生了。...错误捕捉异常 模拟一段购买商品的代码,其中ProductService是产品服务类,而TransactionService是记录交易信息,需求显然就是产品减库存保存交易同一个事务里面,要么同时成功,...这样发生异常,会更有利于定位,这才是合适使用数据库事务的方式。...这样发生异常,会更有利于定位,这才是合适使用数据库事务的方式。 ▼

9910

Spring事务失效场景

看了上面的代码,你可能认为这么简单的问题你不可能犯这么愚蠢的错误,但是想告诉你的是,身边几乎一半的人都被这一幕困扰过。写业务代码的时候,代码可能比较复杂,嵌套的方法很多。...解决方案:看,虽然我们知道处理事务业务代码不能自己捕获异常,但是只要代码变得复杂,我们就很可能再次出错,所以我们处理事务的时候要小心,还是不要使用声明式事务, 并使用编程式事务— transactionTemplate.execute...如果Spring使用JDK动态代理实现,JDK动态代理是基于接口实现的,那么finalstatic修饰的方法也就无法被代理。总而言之,方法连代理都没有,那么肯定无法实现事务回滚了。...NOT_SUPPORTED 如果当前上下文中存在事务,则挂起当前事务,然后新的方法没有事务的环境中执行。NEVER 如果当前上下文中存在事务,则抛出异常,否则在无事务环境上执行代码。...REQUIRED原理是如果当前有一个事务被添加到一个事务中,如果没有,则创建一个新的事务,父事务被调用的事务同一个事务中。即使被调用的异常被捕获,整个事务仍然会被回滚。7.

37920

Spring @Transactional踩坑记

所以代码编写的时候,直接通过@Transactional注解来实现事务。...于是调整了下xml配置文件中,事务管理器声明的顺序,发现事务生效了,因此得证。 ​...对于多数据下的事务解决办法如下: @Transactional注解添加的方法内,数据库更新操作统一使用一个数据源下的Dao,不要出现多个数据源下的Dao的情况 统一了方法内的数据源之后,可以通过@Transactional...具体场景是:假设的货仓里有1000个货物,现在要给用户发货。每批次只能发100个。的货物有一个字段来标识是否已经发过了,对于已经发过的货不能重新发(否则只能哭晕厕所)!...所以updateGoodsStatusByBatchId方法去更新的时候 其实还读取不到对应批次号的记录,也就不会做更新 ​ 解决办法这里就不说了,最终还是同前面一个问题,或者更新的时候根据货物列表去更新

2.5K70

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

), /** * 无论当前事务是否存在,都会创建新事务运行方法, * 这样新事务就可以拥有新的锁隔离级别等特性,与当前事务相互独立 */ REQUIRES_NEW...,「小水」的插入方法外部方法同一个事务中,跟随外部方法发生回滚;「小镜」的插入方法开启一个独立的新事务,不受外部方法异常的影响transaction_required_requiredNew_requiredNewException...小水未入库,小镜入库,水镜未入库外部方法开启事务,「水镜」的插入方法开启一个独立的新事务,因为发生异常,所以自己回滚了;「水镜」的异常没有做处理,因此会被外部方法感知到,「小水」的插入方法外部方法同一个事务中...NESTED 没有外部事务的情况下与 REQUIRED 效果相同;而当存在外部事务的情况下,当外部事务回滚,它会创建一个嵌套事务(子事务)。...外部事务回滚,子事务会跟着回滚;但子事务的回滚不会对外部事务其他同级事务造成影响。 - 完 -

36420

Go:如何实现领域驱动设计(DDD)

然而,跨多团队随机构建微服务可能会带来很大的挫折复杂性。不久前还没有听说过领域驱动设计——DDD,但现在无论走到哪里似乎每个人都在谈论它。...本文,将从头开始构建一个在线酒店应用来一步步地探索DDD的各种概念。希望每实现一部分,对理解DDD会更容易。采用这种方法的原因是,每次阅读DDD资料都很头疼。...有这么多的概念,很宽泛不清楚,不清楚什么是什么。如果你不知道为什么研究DDD头疼,下面的图可能会让你认识到这一点。...大礼帽男还向Dante解释了酒店还需要一些东西来运作,比如顾客、员工、银行供应商。 领域、模型、统一语言和子领域 希望你们喜欢Dante的故事,写它是有原因的。...所以我们应该用一个获取ID的函数一个更改名称的函数来更新聚合。

1.4K30

7Fresh系统快速构建之路——DDD领域驱动设计实践

01 系统构建历程 7Fresh与京东商城一样拥有一整套的交易系统、一键结算系统,但线上不一样的是,我们还有很多线下系统,店内的生产、加工、库存管理、餐饮等等。...(3)技术无关地考虑领域模型,比如使用类图,定义功能场景甚至状态图对象快照。 2、使用DDD进行战略设计相对容易落地,收益明显。使用DDD进行战术设计却遇到了重重困难。...基本我们的框架思路,很机械式的编码设计,很难实现上述的目标; 难点三:按DDD的理论,聚合根之间不赞成使用数据库事务,成本很高。...,存储的实现应该在另外一个包下,通过依赖倒置的方式,把领域模型包含的东西和基础设施层分隔。...大部分业务里的规则还是orderchangestate方法里。这么做的好处就是,它能够表达出想要的设计意图,如果分散在其中的话,可能只与设计文档不一致。

1.4K70

浅谈Spring的事务隔离级别与传播行为

0,无法扣减 REPEATABLE READ虽然解决了不可重复读问题,但是他又会带来幻读问题,幻读是指,一个事务中,第一次查询某条记录,发现没有,但是,当试图更新这条不存在的记录,竟然能成功,并且...为100的数据 成功 7 读取id为100的数据 读取成功 8 提交事务 事务B第2步第一次读取id=99的记录,读到的记录为空,说明不存在id=99的记录。...事务B第5步再次读取id=99的记录,读到的记录仍然为空,但是,事务B第6步试图更新这条不存在的记录,竟然成功了,并且,事务B第8步再次读取id=99的记录,记录出现了。...*/ MANDATORY(2), /** * 无论当前事务是否存在,都会创建新事务允许方法 * 这样新事务就可以拥有新的锁隔离级别等特性,与当前事务相互独立...NESTEDREQUIRES_NEW是有区别的。NESTED传播行为会沿用当前事务的隔离级别锁等特性,而REQUIRES_NEW则可以拥有自己独立的隔离级别锁等特性。

81050

Spring的事务是这么玩的

Spring的官方文档的Features里面Spring的事务作为数据访问的特性被特殊的列了出来,那么Spring的事务和我们平常使用MySQL手动开启的事务有什么区别呢,其实本质上是没有区别的,...,也很丑陋,所以编程式事务我们日常开发中是用不到滴,上面的那些东西声明式事务中进行介绍。...上面注解的意思就是,将当前连接的隔离级别设置为SERIALIZABLE�级别,这个隔离级别可以防止出现脏读,不可重复读幻读,并且设置回归的异常类型为Exception,这个很重要哦,因为rollbackFor...可以看到事务的传播类型不是很多哈。 事务注解不生效的常见场景 一定要捕获异常呢?...但是我们写代码难免要捕获一些异常做一些特殊的处理,难道就只能自己处理数据的回滚了吗,当然不是,方法有很多,你一个把异常捕获了,catch块中抛一个异常给Spring,当然这种做法并不优雅,何为优雅

36020

Spring事务失效的 8 大原因,这次可以吊打面试官了!

(看往期吊打系列请在后台回复:吊打,我会陆续更新……) 前几天栈长不是发了一篇文章,里面有一个关于事务失效的问题: 用 Spring 的 @Transactional 注解控制事务有哪些不生效的场景?...其中有个热心粉丝留言分享了下,觉得总结得有点经验,给置顶了: 以上留言来源微信公众号:Java技术栈,关注一起学Java!...但是觉得还是总结得不够全,今天栈长再总结一下,再延着这位粉丝的总结再补充完善一下,不用说,肯定也不见得总结全,但希望可以帮忙有需要的人。...这个的解决方案之一就是的类中注入自己,用注入的对象再调用另外一个方法,这个不太优雅,另外一个可行的方案可以参考《Spring 如何在一个事务中开启另一个事务?》这篇文章。...,当前若存在事务则挂起,详细的可以参考《事务隔离级别传播机制》这篇文章。

93021

浅谈Java【代理设计模式】以及原理解刨

所谓静态也就是程序运行前就已经存在代理类的字节码文件,代理类委托类的关系在运行前就确定了。 一句话,自己手写代理类就是静态代理。...第三个:参数 对号入座:这里就没参数了 所以null ?...首先从我们注释上可以了解到,method并不是我们真正的目标方法,而target才是,可能有人会疑问,那么target是从哪里传进来的,可以看我图中所标记的地方,类中定义了一个全局变量,通过构造方法的形式...执行真正目标方法之前,先增强,开启事务,然后执行目标对象 ? fastClass基本概念 相当于对类中的所有方法生成一个索引值,直接根据索引调用方法 入口进入 ?...现在知道了对象里面有哪些属性之后,接着往回看到,第一次加载进入初始化方法,会将FastClass对象各个属性进行赋值,f1 f2 属性 也就是代理对象被代理对象的引用,那么i1.getIndex

35010

《解构领域驱动设计》勘误

这也是战略设计分治上起到的效用。当我们战略层次从问题空间映射到解空间,子领域也将映射到限界上下文,即可根据子领域的类型为限界上下文选择不同的建模方式。...第75页(第二次勘误) 文本框文字的第三段: 业务服务的规格说明规约则为领域建模提供了建模依据,帮助分解任务明确职责分配,并在通过测试驱动开发进行领域实现建模,作为识别编写测试用例的主要参考。...应用服务与聚合:应用服务调用领域服务,需要获得聚合,为了避免领域知识的泄漏,不建议应用服务直接调用聚合实体值对象的领域行为,对外,也必须将聚合转换为消息契约对象。...领域服务与工厂、端口聚合:确保了领域逻辑的职责分配,避免领域服务成为事务脚本。 聚合:聚合只能与聚合协作,不知道其他角色构造型,保证了聚合的稳定性纯粹性。...他曾经担任ThoughtWorks中国区持续交付Practice Lead,也是ThoughtWorks任职的Buddy与Sponsor,目前墨尔本一家咨询公司任架构师,业余时间负责ZenUML

63830

Spring MVC系列-(6) 声明式事务

在上面的例子中,为了使事务能够生效,需要加上@EnableTransactionManagement注解,整个源码实现AOP原理一致,注册Bean对对象进行包装,生成增强的Bean,返回代理对象...执行阶段,利用事务拦截器来运行有事务注解的代码,当出现异常进行回滚。...传播行为 Spring中,当一个方法调用另外一个方法,可以让事务采取不同的策略工作,如新建事务或者挂起当前事务等,这便是事务的传播行为。...,就沿用当前事务 */ MANDATORY(2), /** * 无论当前事务是否存在,都会创建新事务允许方法 * 这样新事务就可以拥有新的锁隔离级别等特性...NESTEDREQUIRES_NEW是有区别的。NESTED传播行为会沿用当前事务的隔离级别锁等特性,而REQUIRES_NEW则可以拥有自己独立的隔离级别锁等特性。

14510

海量订单系统微服务开发:订单接口管理后台微服务开发、集成测试

注意日期类型的参数,因为传输过程中只能使用文本方式,所以最后提交查询条件必须将其转换为日期类型的数据。...对于订单来说,订单的状态变化与库存、物流、评价等各个服务息息相关,所以订单的状态变化,会涉及分布式事务管理的问题。比如当买家撤销订单,库存服务的商品存量必须改变。...订单取消的消息生成 首先,order-restapi模块的项目对象模型配置中引入AMQP的消息组件依赖,代码如下所示: <!...刚打开页面,原有的订单状态会处于已经选定的状态。这样当用户页面上选择另一个状态进行提交,就可以对订单状态进行修改操作了。 集成测试 开发完成之后,需要进行一个集成测试。...查看订单接口库存接口的控制台输出日志,看看分布式事务的消息是否已经处理完成。

62630

关于聚合根、领域事件的那点事——深入浅出理解DDD

DDD中,聚合根领域事件是两个核心概念,它们设计实现领域模型起到了重要的作用。本文将通过简单的举例方式,深入浅出地介绍聚合根领域事件,帮助读者更好地理解DDD的核心思想实践方法。...希望本文能够为读者提供有价值的知识启发,帮助大家软件开发中更好地应用DDD的思想方法。 01 前言 今年的敏捷团队建设中,通过Suite执行器实现了一键自动化单元测试。...由此的Runner探索之旅开始了!...2.2 值对象 地址:拥有省、市、区、详细地址等属性。 2.3 领域事件 订单创建事件:当用户下单触发该事件,包含订单信息、商品信息等数据。...聚合根通常具有丰富的行为操作,可以对聚合内部的对象进行复杂的操作。 所以说,真正的聚合根内的方法是基于充血模型封装的,而不是仅仅是对对象的数据封装。

54720

SpringBoot对单元测试支持、常用单元测试功能使用实例

比如,使用 JUnit5, 默认的 spring-boot- starter-test 依赖类库已经无法满足,需要手动引|入 junit-jupiter. <!...原因很简单,从 JUnit4 升级到 JUnit5 testInsert 方法 上的@Test 注解变了。... JUnit4中默认使用的@Test 注解为 org.junit.Test,而在 JUnit5 中需要使用 org.junit.jupiter.api.Test.因此,如果在升级的过程中出现莫名其妙的空指针异常...MockMvcBuilders 提 供 了 对 应 的 standaloneSetup webAppContextSetup 两种创建方法,使用时直接调用即可。...本文就是愿天堂没有BUG给大家分享的内容,大家有收获的话可以分享下,想学习更多的话可以到微信公众号里找我,等你哦。

1.6K30

今天BOSS约了个面试,HR直接发一道面试题

@FilePath: \JavaPub-Blog\docs\posts\java\SpringBoot中实现订单30分钟自动取消的策略.md 今天BOSS约了个面试,HR直接发一道面试题 SpringBoot...(); timeoutOrders.forEach(order -> orderService.cancelOrder(order.getId())); }}实现订单服务:订单服务中...,我们实现查找超时订单取消订单的逻辑。...异常处理:定时任务或异步处理中,应做好异常处理,避免因为某个订单取消失败而影响其他订单的处理。数据库事务更新订单状态,应注意数据库事务的处理,确保数据的一致性。...通过以上步骤,我们可以 Spring Boot 中实现订单超时自动取消的策略。实际应用中,还需要根据具体业务需求进行调整优化。

8310

分布式事务 TCC-Transaction 源码分析 —— 项目实战

支付更新订单状态为 "PAYING"。 订单支付成功,更新订单状态为 "CONFIRMED"。 订单支付失败,更新订单状体为 "PAY_FAILED"。...订单支付成功,更新交易订单状态为 "CONFIRM",并更新增加商店拥有用户的资金账户余额。 订单支付失败,更新交易订单状态为 "CANCEL",并更新增加( 恢复 )下单用户的资金账户余额。...如果使用 REQUIRED 事务传播级别,事务恢复重试,会发起新的事务。...方法,更新减少下单用户的资金账户余额。Try 阶段锁定资源,一定要先扣。TCC 是最终事务一致性,如果先添加,可能被使用。...方法,更新增加商店拥有者用户的资金账户余额。

1.5K80
领券