公司网站开发费进什么费用关键词排名优化价格

张小明 2026/1/19 19:17:02
公司网站开发费进什么费用,关键词排名优化价格,长春最专业的网站建设,剪辑软件一、问题记录在设计一个简单的重命名修改方法的时候考虑使用乐观插入异常捕获来优化代码#xff0c;其中用到了Transaction这个注解。然而这里发现了一个致命缺陷#xff0c;spring事务的问题。永远不要在 Transactional 方法内部依赖 try-catch 来处理由数据库约束引起的 Ru…一、问题记录在设计一个简单的重命名修改方法的时候考虑使用乐观插入异常捕获来优化代码其中用到了Transaction这个注解。然而这里发现了一个致命缺陷spring事务的问题。永远不要在Transactional方法内部依赖try-catch来处理由数据库约束引起的RuntimeException并期望事务能继续正常提交。原代码如下Transaction private void processFileNameDuplicate(AccountFileDO accountFileDO) { String originalFileName accountFileDO.getFileName(); Long accountId accountFileDO.getAccountId(); Long parentId accountFileDO.getParentId(); // 首先尝试插入原始文件名乐观插入 try { accountFileMapper.insert(accountFileDO); return; // 插入成功直接返回 } catch (DataIntegrityViolationException e) { // 文件名冲突需要重命名 } // 文件名冲突处理 String baseName, extension ; int dotIndex originalFileName.lastIndexOf(.); if (dotIndex 0 dotIndex originalFileName.length() - 1) { baseName originalFileName.substring(0, dotIndex); extension originalFileName.substring(dotIndex); } else { baseName originalFileName; } int counter 1; String newFileName; do { newFileName baseName ( counter ) extension; counter; accountFileDO.setFileName(newFileName); try { accountFileMapper.insert(accountFileDO); return; // 成功插入新文件名 } catch (DataIntegrityViolationException e) { // 继续循环尝试下一个文件名 } } while (true); }分析这个乐观锁加异常捕获的设计通过数据库的插入成功与否来判断新的命名是否可用当第一次插入判断失败进入给文件名加后缀继续插入判断的循环直到插入判断成功spring仍然保留着最初的异常DataIntegrityViolationException,最终在默认的Transaction隔离级别下会执行回滚数据库的那一套事务会收到spring给的ROLLBACK指令。这样就会出现一个BUGJava 对象accountFileDO的状态不会回滚尽管被修正了在数据库中依然查询不到。二、设计思路和修正思路策略方法缺陷内存全量加载使用预查询的方法将文件名全部取到SET集合中避免事务问题最终加上联合唯一索引确保最终一致性;内存瓶颈当单个目录文件数量巨大时如超过10万会消耗大量内存。目标化数据库查询先乐观地检查原始名是否存在。如果存在再用LIKE或REGEXP查询只捞出相关的重名文件如笔记(%).txt然后在内存中计算1.数据库压力LIKE或REGEXP查询可能无法完美利用索引在千万级文件的目录下仍可能较慢。2.并发问题依然存在“检查-操作”的竞态条件需要数据库唯一索引来兜底。乐观插入与异常捕获不做任何SELECT检查直接尝试INSERT。如果成功万事大吉。如果失败捕获唯一键异常则在catch块中处理重命名逻辑再次尝试INSERT1.失败时最慢异常的抛出和捕获、事务的回滚开销很大。如果冲突频繁性能会急剧下降。2.代码复杂性高需要处理 SpringTransactional的回滚陷阱通常需要隔离事务实现起来非常复杂且易错。3.设计模式争议滥用异常来控制正常的业务流程。架构级优化1. 分布式锁在执行任何数据库操作前先通过 Redis (SETNX) 等中间件获取一个代表该文件名的分布式锁确保同一时间只有一个线程能操作这个名字。2. ID与名称解耦文件在数据库中的唯一标识是UUID而用户看到的文件名只是一个可变的“别名”。唯一性约束放在(parent_id, alias_name)上。1.引入新依赖需要引入并维护 Redis 等外部系统增加了系统复杂度。2.设计更复杂需要从系统设计的更高层面去规划不再是单个函数的优化。针对于方案3修正思路是启用一个沙箱机制将数据库插入判断操作放到由Transactional(propagation Propagation.REQUIRES_NEW, noRollbackFor DataIntegrityViolationException.class)注解的方法内部。代码如下import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import org.springframework.dao.DataIntegrityViolationException; Component public class AccountFileSaver { Autowired private AccountFileMapper accountFileMapper; /** * 在一个全新的、独立的事务中尝试插入数据。 * 这是实现策略三的关键。 * * param accountFileDO 要插入的文件对象 * throws DataIntegrityViolationException 如果发生唯一键冲突则向上抛出 */ Transactional(propagation Propagation.REQUIRES_NEW) public void tryInsert(AccountFileDO accountFileDO) { // 这个insert操作在自己的“事务沙箱”里运行。 // 如果成功这个小事务就自己提交了。 // 如果因为唯一键冲突失败它会抛出异常并且这个小事务自己回滚。 // 关键在于它的失败不会“污染”调用它的外部主事务。 accountFileMapper.insert(accountFileDO); } }最终调用注入该类调用tryInsert()方法代替原始的插入。实现外置沙箱处理掉异常不影响外部事务。三、使用Transaction的一些总结Spring AOP 代理机制Transactional注解是通过 Spring AOP面向切面编程的代理机制来实现的。当你调用一个 Bean 的方法时比如serviceA.methodA()你实际调用的是 Spring 为serviceA创建的代理对象。这个代理对象在调用真实方法前后会为你加上开启事务、提交/回滚事务的逻辑。但是如果在一个类内部一个方法调用同一个类的另一个方法this.methodB()这个调用是直接在对象内部发生的不会经过代理。因此methodB上的Transactional注解就会失效。所以我们必须把tryInsert方法放到另一个独立的类 (AccountFileSaver) 中然后通过注入来调用 (accountFileSaver.tryInsert())。这样才能确保每次调用都经过代理从而让Propagation.REQUIRES_NEW生效。最终还是采用了策略一简简单单“文件名重复”的场景下用多层事务嵌套设计不合理违背了的整个流程的原子性外层的Transactional的事务获取到其他流程抛出的异常后发起回滚而嵌套的独立事务已经完成提交
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

网站建设好学么邯郸网站建设选哪家

Shortkeys 完全指南:如何快速掌握浏览器自定义快捷键 【免费下载链接】shortkeys A browser extension for custom keyboard shortcuts 项目地址: https://gitcode.com/gh_mirrors/sh/shortkeys Shortkeys 是一款功能强大的浏览器扩展,专门用于创…

张小明 2026/1/17 22:41:50 网站建设

app定制开发商城广州seo推广营销

数字集成电路终极学习指南:完整免费PPT资源助你掌握电路系统设计 【免费下载链接】数字集成电路电路系统与设计第二版PPT下载 数字集成电路:电路系统与设计(第二版)PPT 下载 项目地址: https://gitcode.com/open-source-toolkit…

张小明 2026/1/17 22:41:51 网站建设

双鱼儿 网站建设垂直电商网站建设方案

目录已开发项目效果实现截图开发技术系统开发工具:核心代码参考示例1.建立用户稀疏矩阵,用于用户相似度计算【相似度矩阵】2.计算目标用户与其他用户的相似度系统测试总结源码文档获取/同行可拿货,招校园代理 :文章底部获取博主联系方式&…

张小明 2026/1/17 22:41:53 网站建设

医院诊所网站源码建立平台需要多少钱

WarmFlow工作流引擎事件监听终极指南:5步实现业务逻辑灵活扩展 【免费下载链接】warm-flow Dromara Warm-Flow,国产的工作流引擎,以其简洁轻量、五脏俱全、灵活扩展性强的特点,成为了众多开发者的首选。它不仅可以通过jar包快速集…

张小明 2026/1/17 22:41:56 网站建设

网站建设一般要多少费用关于网站建设实训报告

还在为WPF视频播放器的复杂界面而头疼吗?🤔 每次都要从零开始设计进度条、音量控制、播放按钮?HandyControl来拯救你的开发效率! 【免费下载链接】HandyControl Contains some simple and commonly used WPF controls 项目地址:…

张小明 2026/1/17 22:41:57 网站建设