尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

jcalaBlog 事务管理指南:@Transactional 在博客发布中的正确用法

jcalaBlog 事务管理指南:@Transactional 在博客发布中的正确用法 jcalaBlog 事务管理指南Transactional 在博客发布中的正确用法【免费下载链接】jcalaBloga personal blog site based on springbootsrpingMVCmybatisvelocitybootstrapmysql项目地址: https://gitcode.com/gh_mirrors/jc/jcalaBlogjcalaBlog 是一个基于 Spring Boot MyBatis MySQL 的个人博客系统后台发布一篇博客并非插一条数据那么简单而是涉及文章表和标签表的多步写入。这篇文章就是一份面向新手的 Spring Boot 事务管理指南我们以 jcalaBlog 的博客发布流程为例一步步拆解 Transactional 注解的正确用法帮你彻底搞懂为什么需要事务以及如何配置事务才不出错从此告别数据不一致的烦恼。‍一、为什么博客发布必须依赖事务️在 jcalaBlog 的后台点击发布按钮提交一篇博客时服务层其实要连续完成两次数据库写入把文章标题、正文、Markdown 源码插入blog_view文章表把文章对应的标签逐条插入view_tag标签表如果第二步在中途失败就会出现文章在、标签丢的脏数据读者点开文章却看不到分类标签后台管理也会错乱。事务Transaction的价值就是把这两步打包成一个不可分割的整体要么全部成功提交要么全部失败回滚从而保证数据一致性。这正是 Spring Boot 事务管理要解决的核心问题。二、jcalaBlog 中 Transactional 用在哪里打开 BlogSerImpl.java 就能看到所有涉及多表写入的方法都加上了Transactional注解方法事务注解涉及的表操作addBlog发布博客✅Transactional插入文章 插入标签updateBlog更新博客✅Transactional更新文章 重建标签deleteBlogById删除博客✅Transactional删除文章记录同样的做法也出现在 InfoSerImpl.java 的修改密码、ProjectSerImpl.java 的新增项目等方法中。规律很简单只要一个方法里有多条 SQL 写入就值得用事务包起来。三、addBlog 发布博客的完整事务流程 我们以最典型的addBlog方法为例看看 jcalaBlog 是如何用事务组织一次博客发布的Transactional(isolation Isolation.READ_COMMITTED) public void addBlog(BlogView blogView){ blogView.setDate(new Date(System.currentTimeMillis())); blogMapper.insertBlog(blogView); // ① 插入文章 addViewTag(blogView.getTags(), blogView.getVid()); // ② 插入标签 }这里有一个特别值得新手留意的细节第①步插入文章时BlogMapper.java 通过SelectKey配合LAST_INSERT_ID()把自增主键回填给blogView.getVid()第②步插入标签时正好复用这个新文章的 ID。也就是说标签和文章通过主键强关联。一旦第②步出错第①步的半成品文章也必须一并撤销否则就会产生孤儿数据。没有Transactional这两步就是两条独立的 SQL后果不堪设想。四、为什么选择 READ_COMMITTED 隔离级别细心的你可能注意到jcalaBlog 的每个事务注解都明确指定了isolation Isolation.READ_COMMITTED。数据库事务有四种隔离级别从低到高依次为READ UNCOMMITTED能读到未提交的数据可能产生脏读 ❌READ COMMITTED只能读到已提交的数据杜绝脏读 ✅REPEATABLE READ同一事务内多次读取结果一致MySQL 默认级别SERIALIZABLE串行执行性能开销最大 ⚠️jcalaBlog 选择READ_COMMITTED是很务实的决定博客系统是高并发读、低频写的场景既要避免读到别人未提交的脏数据又不想为了可重复读付出额外的锁开销。数据源配置在 application-dev.yml基于 HikariCP 连接池连接 MySQL这套读已提交策略足以满足个人博客对数据一致性和性能的双重要求。五、更新与删除博客时的事务处理 ♻️发布之外updateBlog和deleteBlogById同样是事务的用武之地。updateBlog的逻辑是先更新文章表内容再deleteViewTag清空旧标签最后重新insertViewTag写入新标签。删除 插入标签必须是原子的——如果删掉了旧标签却没能写入新标签文章就变成了无标签孤儿。而deleteBlogById删除文章时事务保证了删除操作要么完整生效、要么完全不生效不会留下残缺记录。前后端调用链可参考 BlogCtrl.java 中的postAction、update和delete三个控制器方法。六、使用 Transactional 的三个避坑要点 ⚠️光会加注解还不够新手最容易踩的坑有以下三个自调用会让事务失效Transactional依赖 Spring AOP 代理如果在同一个类内部通过this.xxx()调用事务方法代理不会生效。请确保事务方法由外部 Bean 调用。默认只回滚运行时异常注解默认对RuntimeException如空指针、SQL 异常回滚如果方法里捕获了受检异常还想要回滚需要显式指定rollbackFor Exception.class。读操作不必加事务jcalaBlog 对查询类方法如getTagList、getArchive用Cacheable做缓存而不是加事务这样既保证了速度又避免了无谓的连接占用。事务用在写缓存用在读这是很好的工程习惯。七、动手验证把 jcalaBlog 跑起来 纸上得来终觉浅想亲手验证事务效果可以这样快速起步git clone https://gitcode.com/gh_mirrors/jc/jcalaBlog项目根目录自带 docker-compose.yml配合 MySQL 即可一键启动。默认后台地址/admin初始账号admin、密码admin详见 README.md。登录后试着发布一篇带多个标签的博客然后在blog_view与view_tag两张表里核对数据你就能直观感受到事务带来的数据一致性保障。总结 ✅通过 jcalaBlog 这个真实项目我们完整走了一遍 Spring Boot 事务管理的核心用法发布博客的多表写入离不开 TransactionalREAD_COMMITTED 是兼顾一致性与性能的合理选择注解的正确使用还要避开自调用和异常回滚的坑。掌握了这些你的 Spring Boot 博客开发之路会顺畅许多。【免费下载链接】jcalaBloga personal blog site based on springbootsrpingMVCmybatisvelocitybootstrapmysql项目地址: https://gitcode.com/gh_mirrors/jc/jcalaBlog创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表