当前位置: 首页 > article >正文

SpringBoot+MyBatis事务控制实战:从默认行为到精细化手动管理

1. SpringBootMyBatis事务的默认行为解析第一次在SpringBoot项目中使用MyBatis时我发现一个有趣的现象明明没有显式开启事务数据库操作却自动运行在事务中。后来通过日志分析才明白这是SpringBoot的默认行为。就像我们去餐厅吃饭服务员默认会给每位顾客倒上一杯水不需要特别说明。在单元测试中这个特性尤为明显。比如下面这段测试代码SpringBootTest public class UserServiceTest { Autowired private UserMapper userMapper; Test public void testInsert() { User user new User(张三, 25); userMapper.insert(user); System.out.println(插入完成); } }运行时会发现控制台打印了Began transaction的日志。这就像魔术师在表演前悄悄布置好了机关观众还没察觉表演就已经开始了。事务的默认传播行为是PROPAGATION_REQUIRED意思是如果当前没有事务就新建一个如果已经存在事务就加入其中。这种设计很贴心就像智能家居系统当你晚上回家时灯光会自动亮起不需要手动开关。2. 单元测试中的事务陷阱与解决方案2.1 测试中的事务干扰问题在实际项目中我踩过一个坑测试数据凭空消失。明明测试用例执行成功了数据库里却找不到刚插入的数据。后来发现是因为测试方法默认在事务中运行测试结束后事务回滚了。这就像用铅笔在笔记本上写字测试时写的内容事务中的操作在合上笔记本测试结束后自动消失了回滚。要保留这些笔记我们需要特别说明Test Rollback(false) public void testPersistData() { // 测试代码 }或者在类级别加上注解SpringBootTest Transactional(propagation Propagation.NOT_SUPPORTED) public class NoTransactionTest { // 测试方法 }2.2 事务传播行为的七种武器Spring提供了丰富的事务传播行为选项就像瑞士军刀的不同工具REQUIRED默认有事务就加入没有就新建SUPPORTS有事务就加入没有也无所谓MANDATORY必须要有事务否则抛异常REQUIRES_NEW新建事务挂起当前事务NOT_SUPPORTED非事务方式执行挂起当前事务NEVER必须在非事务环境下执行否则抛异常NESTED嵌套事务在测试环境中NOT_SUPPORTED就像关闭自动保存功能让每次操作立即生效Test Transactional(propagation Propagation.NOT_SUPPORTED) public void testRealTimeInsert() { // 每次插入都会立即提交 }3. 手动事务控制的进阶技巧3.1 PlatformTransactionManager实战有时候我们需要更精细地控制事务就像手动挡汽车比自动挡更有操控感。Spring的PlatformTransactionManager就是我们的换挡杆Autowired private PlatformTransactionManager transactionManager; public void batchInsertWithManualControl(ListUser users) { DefaultTransactionDefinition def new DefaultTransactionDefinition(); def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW); for (User user : users) { TransactionStatus status transactionManager.getTransaction(def); try { userMapper.insert(user); transactionManager.commit(status); } catch (Exception e) { transactionManager.rollback(status); throw e; } } }这种手动控制方式特别适合批量操作可以避免一个失败导致全部回滚就像搬家时分开打包物品一个箱子损坏不会影响其他箱子。3.2 事务隔离级别的选择不同的业务场景需要不同的事务隔离级别就像不同的天气要穿不同的衣服隔离级别脏读不可重复读幻读适用场景READ_UNCOMMITTED✓✓✓几乎不用READ_COMMITTED×✓✓普通查询REPEATABLE_READ××✓财务系统SERIALIZABLE×××票务系统在Spring中设置隔离级别Transactional(isolation Isolation.REPEATABLE_READ) public void updateAccountBalance() { // 业务逻辑 }4. 事务性能优化实战经验4.1 连接池配置建议事务性能与数据库连接池密切相关。经过多次压测我总结出这些经验值# 推荐配置 spring.datasource.hikari.maximum-pool-size20 spring.datasource.hikari.minimum-idle5 spring.datasource.hikari.idle-timeout30000 spring.datasource.hikari.max-lifetime1800000连接池就像公司里的会议室太少会影响效率太多又浪费资源。根据我的经验最大连接数设置为CPU核心数的2-3倍比较合适。4.2 事务超时设置长时间运行的事务会占用数据库资源就像餐厅里占着桌子不点菜的顾客。我们可以设置超时时间Transactional(timeout 30) // 30秒超时 public void longRunningProcess() { // 复杂业务逻辑 }如果操作预计耗时较长最好拆分成多个小事务就像把大件行李分多次搬运。5. 常见问题排查指南5.1 事务不生效的六大原因在帮助新手排查问题时我发现这些常见陷阱方法不是public的异常被catch没有抛出同类方法调用this.method()数据库引擎不支持如MyISAM异常类型不是RuntimeException注解被错误覆盖这就像侦探破案要逐一排查每个可能性。建议在配置中加入logging.level.org.springframework.transaction.interceptorTRACE这样可以在日志中看到详细的事务决策过程。5.2 分布式事务的替代方案对于跨服务的事务需求我通常建议使用最终一致性方案而非强一致性。比如本地消息表事务消息RocketMQSaga模式TCC模式这就像跨国快递与其要求所有包裹同时到达强一致性不如确保每个包裹最终都能送达最终一致性。6. 最佳实践总结经过多个项目的实战我总结了这些经验法则保持事务短小精悍避免在事务中进行远程调用合理设置隔离级别为只读操作添加Transactional(readOnlytrue)异常处理要明确监控事务执行时间就像老司机分享的驾驶技巧这些经验能帮你避开很多坑。特别是在高并发场景下合理的事务设计能让系统性能提升数倍。最后提醒一点事务不是万能的就像安全带不能防止所有交通事故。合理的架构设计、正确的索引、适当的缓存这些都能减少对事务的依赖。在实际项目中我通常会先考虑是否可以不用事务而不是如何用事务解决。

相关文章:

SpringBoot+MyBatis事务控制实战:从默认行为到精细化手动管理

1. SpringBootMyBatis事务的默认行为解析 第一次在SpringBoot项目中使用MyBatis时,我发现一个有趣的现象:明明没有显式开启事务,数据库操作却自动运行在事务中。后来通过日志分析才明白,这是SpringBoot的默认行为。就像我们去餐厅…...

csvlens作为库使用教程:在Rust项目中集成CSV查看功能

csvlens作为库使用教程:在Rust项目中集成CSV查看功能 【免费下载链接】csvlens Command line csv viewer 项目地址: https://gitcode.com/gh_mirrors/cs/csvlens 想要在你的Rust应用中添加一个功能强大、交互式的CSV数据查看器吗?csvlens不仅是一…...

新手零失败指南:基于快马平台生成win10安装openclaw的交互式学习应用

最近在Windows 10上折腾OpenClaw的安装,作为新手真的踩了不少坑。环境配置报错、依赖冲突、权限问题...每次遇到错误都要花大量时间搜索解决方案。后来发现用InsCode(快马)平台可以快速生成带交互指导的安装程序,终于找到了适合新手的打开方式。这里把完…...

BRINC执法无人机升级,开启应急响应新高度

Starlink连接与长航时,执法无人机的新突破无人机初创公司BRINC对其执法无人机进行重大升级,最新款的“守护者”(Guardian)无人机每一台都将具备Starlink连接功能,这在商用无人机领域尚属首次。此外,这款将于…...

「理」的征程(C++引入2——变量、运算与赋值(初步)(上))

在上一篇博文中,我教给大家了C的基础知识——输出,那么今天,让我们迈出踏入C殿堂的第二步——变量、运算与赋值。(虽然说这篇文章好像只讲了变量)(P.S.我在学并查集的时候发现了一个非常棒的博文&#xff0…...

如何快速构建安全高效的AWS VPC网络架构:完整实战指南

如何快速构建安全高效的AWS VPC网络架构:完整实战指南 【免费下载链接】aws-cloudformation-templates awslabs/aws-cloudformation-templates: 是一个包含各种 AWS CloudFormation 模板的存储库。适合查找和学习 AWS CloudFormation 模板的示例,以及用于…...

我的世界Java版1.21.4的Fabric模组开发教程(二)创建物品

这是适用于Minecraft Java版1.21.4的Fabric模组开发系列教程专栏第二章——创建物品。想要阅读其他内容,请查看或订阅上面的专栏。 物品(Items) 指的是可以被玩家和其他实体拾起并使用的元素。想要在Minecraft中添加自己的物品,通常需要完成下面的步骤&…...

Nunchaku-flux-1-dev一键部署教程:Ubuntu20.04环境配置

Nunchaku-flux-1-dev一键部署教程:Ubuntu20.04环境配置 1. 开篇:为什么选择这个部署方案 如果你刚接触Linux环境下的模型部署,可能会觉得配置各种依赖和环境变量很头疼。Nunchaku-flux-1-dev作为一个功能强大的模型,其实在Ubunt…...

ChatDev SaaS平台终极指南:如何用AI多智能体技术10分钟开发专业软件

ChatDev SaaS平台终极指南:如何用AI多智能体技术10分钟开发专业软件 【免费下载链接】ChatDev 该项目利用由大型语言模型(LLM)驱动的多智能体协作技术,以自然语言概念为输入,实现定制化软件的开发过程。 项目地址: h…...

终极暗黑破坏神2现代化方案:d2dx让经典游戏在宽屏时代重获新生

终极暗黑破坏神2现代化方案:d2dx让经典游戏在宽屏时代重获新生 【免费下载链接】d2dx D2DX is a complete solution to make Diablo II run well on modern PCs, with high fps and better resolutions. 项目地址: https://gitcode.com/gh_mirrors/d2/d2dx 你…...

从零搭建AI应用前端:微信小程序调用Qwen1.5-1.8B GPTQ模型API

从零搭建AI应用前端:微信小程序调用Qwen1.5-1.8B GPTQ模型API 最近在折腾一个挺有意思的项目,想给朋友做个能聊天的AI小程序。后端我选了个轻量但能力不错的模型——Qwen1.5-1.8B GPTQ,部署在星图GPU平台上,API接口已经调通了。接…...

从“马斯克算法”中学到的 5 个硬核生存准则,如何颠覆平庸的终极护城河

你以为靠类比就能成功?其实马斯克的5条物理算法才是颠覆平庸的终极护城河作为一名深耕代码、产品迭代和系统架构的开发者,我曾经也深陷大多数人的陷阱:面对新需求,第一反应就是翻竞品案例、套行业模板,然后埋头优化流程…...

终极Web-Check备份恢复指南:数据安全保障策略详解

终极Web-Check备份恢复指南:数据安全保障策略详解 【免费下载链接】web-check 🕵️‍♂️ 用于分析任何网站的一体化 OSINT 工具 项目地址: https://gitcode.com/GitHub_Trending/we/web-check Web-Check是一款功能强大的开源OSINT工具&#xff0…...

OpenClaw调试技巧:Qwen3.5-4B-Claude-4.6-Opus-Reasoning-Distilled-GGUF任务失败排查手册

OpenClaw调试技巧:Qwen3.5-4B-Claude-4.6-Opus-Reasoning-Distilled-GGUF任务失败排查手册 1. 问题定位的基本框架 当OpenClaw任务执行失败时,我通常会按照"环境-模型-日志"三层结构进行排查。上周在调试一个自动化周报生成任务时&#xff0…...

5个技巧让Elixir调试效率提升10倍:dbg函数输出优化指南

5个技巧让Elixir调试效率提升10倍:dbg函数输出优化指南 【免费下载链接】elixir Elixir 是一种用于构建可扩展且易于维护的应用程序的动态函数式编程语言。 项目地址: https://gitcode.com/GitHub_Trending/el/elixir Elixir是一种用于构建可扩展且易于维护的…...

终极Slick轮播图与React结合指南:10个组件化开发实践技巧

终极Slick轮播图与React结合指南:10个组件化开发实践技巧 【免费下载链接】slick the last carousel youll ever need 项目地址: https://gitcode.com/GitHub_Trending/sl/slick Slick轮播图插件是现代前端开发中最强大、最灵活的轮播组件之一,被…...

Umi-OCR在Windows 7系统的深度适配与效能优化指南

Umi-OCR在Windows 7系统的深度适配与效能优化指南 【免费下载链接】Umi-OCR Umi-OCR: 这是一个免费、开源、可批量处理的离线OCR软件,适用于Windows系统,支持截图OCR、批量OCR、二维码识别等功能。 项目地址: https://gitcode.com/GitHub_Trending/um/…...

pose-search:5分钟搭建你的人体姿态搜索系统

pose-search:5分钟搭建你的人体姿态搜索系统 【免费下载链接】pose-search x6ud.github.io/pose-search 项目地址: https://gitcode.com/gh_mirrors/po/pose-search 在人工智能技术飞速发展的今天,人体姿态搜索已成为计算机视觉领域的重要突破。p…...

终极指南:如何测试Binwalk自定义提取器:从单元测试到集成测试的完整方案

终极指南:如何测试Binwalk自定义提取器:从单元测试到集成测试的完整方案 【免费下载链接】binwalk Firmware Analysis Tool 项目地址: https://gitcode.com/gh_mirrors/bi/binwalk Binwalk 是一款强大的固件分析工具,专门用于识别和提…...

FunClip终极指南:三步完成本地AI视频剪辑与智能处理高效工作流

FunClip终极指南:三步完成本地AI视频剪辑与智能处理高效工作流 【免费下载链接】FunClip Open-source, accurate and easy-to-use video clipping tool, LLM based AI clipping intergrated || 开源、精准、方便的视频切片工具,集成了大语言模型AI智能剪…...

SDXL 1.0绘图工坊效果展示:多风格高清作品集,看看AI能画出多惊艳的图片

SDXL 1.0绘图工坊效果展示:多风格高清作品集,看看AI能画出多惊艳的图片 1. 开篇:当AI成为数字艺术家 想象一下,你只需要输入一段文字描述,就能在几秒钟内获得一张细节丰富、风格多样的高清图像——这不是科幻电影&am…...

STM32F103四位数码管动态显示实战:从硬件连接到代码调试(附Proteus仿真)

STM32F103四位数码管动态显示实战:从硬件连接到代码调试(附Proteus仿真) 当你第一次拿到STM32开发板和四位数码管时,可能会被那些密密麻麻的引脚和闪烁的数字弄得一头雾水。别担心,这篇文章将带你从零开始,…...

MMA7660FC三轴加速度计嵌入式驱动库设计与应用

1. 项目概述Grove_3-Axis_Digital_Accelerometer_MMA7660FC_Library 是专为 Seeed Studio Grove 系列模块中 MMA7660FC 三轴数字加速度传感器设计的嵌入式驱动库。该库面向基于 ARM Cortex-M 架构(如 STM32F0/F1/F4/L0/L4 系列)的微控制器平台&#xff0…...

Cobar高可用性实现:心跳检测与故障转移的完整教程

Cobar高可用性实现:心跳检测与故障转移的完整教程 【免费下载链接】cobar a proxy for sharding databases and tables 项目地址: https://gitcode.com/gh_mirrors/co/cobar Cobar作为阿里巴巴开源的分布式数据库中间件,其高可用性实现是保障企业…...

Codesys实战排障手记:从证书过期到RTC时钟校准

1. 当Codesys突然弹出证书过期警告时 那天我正在客户现场调试禾川HCQ1系列PLC,刚打开Codesys V3.5开发环境,一个鲜红的证书过期警告就弹了出来。这种突如其来的报错让现场气氛瞬间紧张——产线等着调试,设备等着联调,而系统却在关…...

Drawille Turtle图形编程:简单易学的终端绘图方法

Drawille Turtle图形编程:简单易学的终端绘图方法 【免费下载链接】drawille Pixel graphics in terminal with unicode braille characters 项目地址: https://gitcode.com/gh_mirrors/dr/drawille Drawille是一个创新的Python库,它使用Unicode盲…...

OpenClaw模型热切换:GLM-4.7-Flash与Qwen3-32B的任务适配对比

OpenClaw模型热切换:GLM-4.7-Flash与Qwen3-32B的任务适配对比 1. 为什么需要模型热切换 上周我在用OpenClaw处理一个复杂的文件整理任务时,遇到了一个典型问题:Qwen3-32B模型虽然能给出高质量的文件分类建议,但每个决策都要消耗…...

告别新建工程烦恼:手把手教你为复旦微FM33LE0XX搭建IAR标准库工程模板

复旦微FM33LE0XX开发实战:打造可复用的IAR标准工程模板 在嵌入式开发领域,每次新建项目都从零开始配置工程文件无异于重复造轮子。对于复旦微FM33LE0XX系列单片机开发者而言,一个精心设计的标准工程模板能节省至少80%的初始化时间。本文将带你…...

Symfony Doctrine Bridge 编译器传递深度解析:RegisterMappingsPass 与 RegisterUidTypePass 源码解读

Symfony Doctrine Bridge 编译器传递深度解析:RegisterMappingsPass 与 RegisterUidTypePass 源码解读 【免费下载链接】doctrine-bridge Provides integration for Doctrine with various Symfony components 项目地址: https://gitcode.com/gh_mirrors/do/doctr…...

Anno 1800模组加载器完全掌握指南:从安装到创意开发

Anno 1800模组加载器完全掌握指南:从安装到创意开发 【免费下载链接】anno1800-mod-loader The one and only mod loader for Anno 1800, supports loading of unpacked RDA files, XML merging and Python mods. 项目地址: https://gitcode.com/gh_mirrors/an/an…...