海兴网站建设公司欧美风格网站模版

张小明 2026/1/13 13:18:49
海兴网站建设公司,欧美风格网站模版,模具公司网站中品质见证怎么做,美术对网站开发有用吗解决的痛点在数据库事务操作中#xff0c;经常会出现“事务未按预期生效”的情况。 其中最常见的两类场景是#xff1a;同类内部方法调用导致事务代理未生效对事务边界的控制过度依赖 Transactional 注解下面举一个在开发中可能会遇到的一个事务失效的场景#xff1a;//保存…解决的痛点在数据库事务操作中经常会出现“事务未按预期生效”的情况。 其中最常见的两类场景是同类内部方法调用导致事务代理未生效对事务边界的控制过度依赖 Transactional 注解下面举一个在开发中可能会遇到的一个事务失效的场景//保存父方法 public void saveParentMethod() { //插入parent StockInfo stockInfo new StockInfo(); stockInfo.setProductId(parent); this.stockInfoMapper.insertSelective(stockInfo); //插入child this.saveChildStockInfo(); } //保存子方法 Transactional(rollbackFor Exception.class) public void saveChildStockInfo() { StockInfo stockInfo new StockInfo(); stockInfo.setProductId(child); this.stockInfoMapper.insertSelective(stockInfo); //制造异常 int i 1 / 0; }我们想当然的认为parent应该入库而child不应该然而实际情况是child也入库了。原因并不是事务失效而是Transactional根本没有生效。Spring 的事务是基于代理实现的同类内部方法调用不会经过代理因此事务注解不会被触发。OKTransactionHelper工具类就是解决类似的情况并且可以在一个类中使用private定义的私有方法同样能进行事务。TransactionHelper 的核心作用是 让事务控制从「依赖 Spring AOP 代理」转变为「显式、可控的代码级事务边界」。更适合以下场景复杂流程编排同类内部方法调用希望显式声明事务边界的位置使用方式Component RequiredArgsConstructor public class YourClass { // 构造注入TransactionHelper private final TransactionHelper transactionHelper; public ResultVoid executeBiz(TaskContext context) { // ... // 事务 transactionHelper.runInTransaction(() - { // 保存订单 saveOrder(order); // 更新库存数量 updateStore(128); }); return Result.ok(); } // 保存订单 private void saveOrder(Order order) { orderMapper.save(order) } // 更新库存数量 private void updateStore(int count) { storeMapper.updateCount(count); } }这里TransactionHelper充分利用了JDK8之后的函数式编程特点。把要进行事务的方法当做参数传入。最终利用spring的PlatformTransactionManager统一控制事务行为。注意runInTransaction 中的代码块不应再嵌套 Transactional 注解 否则容易造成事务传播语义混乱。TransactionHelper庐山真面目/** * 事务帮助类 * * author 老马 */ Slf4j Component RequiredArgsConstructor public class TransactionHelper { private final PlatformTransactionManager transactionManager; /** * -1 表示不覆盖 Spring 默认配置 */ public static final int DEFAULT_TIMEOUT TransactionDefinition.TIMEOUT_DEFAULT; /** * 原事务REQUIRED */ public T T runInTransaction(SupplierT supplier) { return execute(TransactionDefinition.PROPAGATION_REQUIRED, DEFAULT_TIMEOUT, supplier); } public void runInTransaction(Runnable runnable) { runInTransaction(DEFAULT_TIMEOUT, runnable); } public T T runInTransaction(int timeout, SupplierT supplier) { return execute(TransactionDefinition.PROPAGATION_REQUIRED, timeout, supplier); } public void runInTransaction(int timeout, Runnable runnable) { execute(TransactionDefinition.PROPAGATION_REQUIRED, timeout, () - { runnable.run(); return null; }); } /** * 新事务REQUIRES_NEW */ public T T runInNewTransaction(SupplierT supplier) { return execute(TransactionDefinition.PROPAGATION_REQUIRES_NEW, DEFAULT_TIMEOUT, supplier); } public void runInNewTransaction(Runnable runnable) { runInNewTransaction(DEFAULT_TIMEOUT, runnable); } public T T runInNewTransaction(int timeout, SupplierT supplier) { return execute(TransactionDefinition.PROPAGATION_REQUIRES_NEW, timeout, supplier); } public void runInNewTransaction(int timeout, Runnable runnable) { execute(TransactionDefinition.PROPAGATION_REQUIRES_NEW, timeout, () - { runnable.run(); return null; }); } /** * 通用事务执行逻辑 */ private T T execute(int propagation, int timeout, SupplierT supplier) { TransactionTemplate template buildTemplate(propagation, timeout); return template.execute(status - { try { return supplier.get(); } catch (RuntimeException e) { status.setRollbackOnly(); log.error(事务回滚propagation{}, timeout{}, propagation, timeout, e); throw e; } catch (Exception e) { status.setRollbackOnly(); log.error(事务回滚propagation{}, timeout{}, propagation, timeout, e); throw new RuntimeException(e); } catch (Throwable t) { status.setRollbackOnly(); log.error(事务回滚propagation{}, timeout{}, propagation, timeout, t); throw t; } }); } /** * 构建事务模板 */ private TransactionTemplate buildTemplate(int propagation, int timeout) { TransactionTemplate template new TransactionTemplate(transactionManager); template.setPropagationBehavior(propagation); // timeout -1 表示使用 Spring 默认配置 if (timeout ! DEFAULT_TIMEOUT) { template.setTimeout(timeout); } return template; } }补充说明为确保 Error / 非 RuntimeException 场景下事务同样回滚 execute 方法中统一捕获 Throwable 并显式标记 rollbackOnly。TransactionHelper不会吞异常 异常会继续向上抛出由上层统一处理 以避免出现“事务回滚但业务误以为成功”的问题。使用中特别注意⚠ 特别注意强约束TransactionHelper 基于 Spring 本地事务PlatformTransactionManager因此仅对【单一数据源】生效。如下代码是有效的DS(TableNameConstant.DATABASE_NAME_RTPAY) public void testTransaction() { transactionHelper.runInTransaction(() - { bizServiceHelpler.insertMerchant(); bizServiceHelpler.insertCity(); }); }在 DS 多数据源场景下同一个事务中禁止切换数据源不同数据源之间无法实现原子回滚如果业务需要跨数据源事务控制请使用 DS 框架提供的 DSTransactional或明确拆分为多个独立事务处理。
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

淘宝美工做倒计时图片网站广州推广系统

看不见的“眼睛”:如何用Arduino串口监视器真正读懂你的代码 你有没有过这样的经历? 电路接好了,程序也烧录进去了,可板子就是没反应。LED不亮、电机不动、传感器读数全是零……而你只能干瞪眼,不知道问题出在哪。 在…

张小明 2026/1/9 11:04:17 网站建设

长沙建网站需要多少钱企业服务公司起名

33-智能优化算法-白鲸优化算法 白鲸优化算法(Beluga Whale Optimization,BWO)是Zhong等人于2022年新提出的一种算法,用于求解优化问题。 BWO算法建立了探索、开发和落鲸的三个阶段,分别对应于伴泳、捕食和落鲸行…

张小明 2026/1/9 4:36:46 网站建设

云主机做网站域名打不开建设部网站继续教育

第一章:智普Open-AutoGLM开源项目概述智普AI推出的Open-AutoGLM是一个面向自动化自然语言处理任务的开源框架,旨在降低大模型应用开发门槛,提升从数据准备到模型部署的全流程效率。该项目基于AutoGLM架构,融合了自动化机器学习&am…

张小明 2026/1/9 11:04:13 网站建设

python 网站开发那个好广东网页空间租用平台

深入解析Apache Web服务器相关知识 1. 基础概念与配置文件 Apache是一款基于NCSA的httpd的流行且稳定的Web服务器,其配置涉及多个重要文件和概念。 配置文件 : httpd.conf :Apache在此配置文件中查找设置,它具备以前 access.conf 和 srm.conf 文件的所有功能。 a…

张小明 2026/1/9 11:04:12 网站建设

大连建设科技网站校园网站建设实施方案

如何快速掌握diff-pdf:新手的终极PDF对比指南 【免费下载链接】diff-pdf A simple tool for visually comparing two PDF files 项目地址: https://gitcode.com/gh_mirrors/di/diff-pdf 在日常工作中,你是否曾经为对比两个PDF文件而头疼不已&…

张小明 2026/1/9 11:04:10 网站建设

外贸网站怎么做seo优化jsp做就业网站

文章目录 具体实现截图主要技术与实现手段关于我本系统开发思路java类核心代码部分展示结论源码lw获取/同行可拿货,招校园代理 :文章底部获取博主联系方式! 具体实现截图 同行可拿货,招校园代理 Springbootdjango_kg7s76n 基于微信小程序的旧物二…

张小明 2026/1/13 7:48:25 网站建设