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

用SpringBoot的@Transactional注解,搞定一个完整的用户权限更新业务(含MyBatis)

用SpringBoot的Transactional注解构建高可靠用户权限更新服务在用户管理系统开发中权限更新往往涉及多表联动操作——更新用户基础信息的同时可能需要调整角色关联、刷新权限列表。这种要么全部成功要么全部失败的业务场景正是数据库事务的典型用武之地。本文将基于SpringBootMyBatis技术栈通过一个完整的用户权限更新案例演示如何正确运用Transactional注解实现事务控制。1. 环境准备与项目结构1.1 基础依赖配置确保pom.xml包含必要的依赖项dependencies !-- SpringBoot Starter -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency !-- MyBatis整合 -- dependency groupIdorg.mybatis.spring.boot/groupId artifactIdmybatis-spring-boot-starter/artifactId version2.2.2/version /dependency !-- MySQL驱动 -- dependency groupIdmysql/groupId artifactIdmysql-connector-java/artifactId scoperuntime/scope /dependency /dependencies1.2 数据库表设计用户权限系统通常需要三张核心表表名字段示例说明sys_userid, username, password用户基础信息表sys_roleid, role_name, role_key角色定义表user_role_relid, user_id, role_id用户-角色关联表对应的MyBatis映射文件应包含基本的CRUD操作例如!-- UserMapper.xml -- update idupdateUser parameterTypeUser UPDATE sys_user SET username#{username}, password#{password} WHERE id#{id} /update insert idinsertUserRole INSERT INTO user_role_rel(user_id, role_id) VALUES(#{userId}, #{roleId}) /insert2. 事务性服务层实现2.1 基础事务配置SpringBoot默认已启用事务管理无需额外配置EnableTransactionManagement。创建服务类时直接在方法上添加注解Service public class UserAuthServiceImpl implements UserAuthService { Autowired private UserMapper userMapper; Autowired private RoleMapper roleMapper; Transactional Override public void updateUserWithRoles(User user, ListLong roleIds) { // 步骤1更新用户基础信息 userMapper.updateUser(user); // 步骤2删除旧角色关联 roleMapper.deleteUserRoles(user.getId()); // 步骤3插入新角色关联 roleIds.forEach(roleId - { roleMapper.insertUserRole(user.getId(), roleId); }); } }2.2 事务传播行为实战当业务需要调用其他服务方法时传播行为的设置尤为关键Transactional(propagation Propagation.REQUIRED) public void fullUpdate(User user, ListLong roleIds, AuthInfo auth) { // 更新用户基础信息当前事务 updateUserWithRoles(user, roleIds); try { // 独立新事务更新权限 authService.updateAuthWithNewTransaction(auth); } catch (Exception e) { // 权限更新失败不影响主事务 log.error(权限更新异常, e); } }其中authService的方法定义Transactional(propagation Propagation.REQUIRES_NEW) public void updateAuthWithNewTransaction(AuthInfo auth) { // 独立事务执行 }3. 事务异常处理策略3.1 回滚规则配置默认情况下只有未检查异常RuntimeException会触发回滚。如需自定义Transactional(rollbackFor {BusinessException.class, DataIntegrityViolationException.class}, noRollbackFor {IllegalArgumentException.class}) public void safeUpdate(User user) { // 业务逻辑 }3.2 异常处理最佳实践避免在事务方法内捕获所有异常// 不推荐做法 Transactional public void updateUserProblematic(User user) { try { userMapper.update(user); } catch (Exception e) { // 捕获所有异常导致事务不会回滚 log.error(更新失败, e); } } // 推荐做法 Transactional public void updateUserRecommended(User user) { userMapper.update(user); // 让异常抛出到方法外 }4. 事务调试与验证4.1 事务生效验证通过以下方法检查事务是否按预期工作在方法中故意抛出RuntimeException观察数据库数据是否回滚检查事务日志输出# application.properties logging.level.org.springframework.transaction.interceptorTRACE logging.level.org.springframework.jdbc.datasource.DataSourceTransactionManagerDEBUG4.2 常见问题排查问题1事务不生效的可能原因方法非public修饰自调用同一个类中方法互相调用异常被捕获未抛出数据库引擎不支持事务如MyISAM问题2事务隔离级别冲突Transactional(isolation Isolation.READ_COMMITTED) public void updateWithIsolation(User user) { // 使用读已提交隔离级别 }各隔离级别对比隔离级别脏读不可重复读幻读READ_UNCOMMITTED可能可能可能READ_COMMITTED不可能可能可能REPEATABLE_READ不可能不可能可能SERIALIZABLE不可能不可能不可能5. 性能优化与高级技巧5.1 只读事务优化对于查询操作使用只读事务可提升性能Transactional(readOnly true) public User getUserWithRoles(Long userId) { User user userMapper.selectById(userId); user.setRoles(roleMapper.listByUserId(userId)); return user; }5.2 超时设置防止长时间运行的事务阻塞系统Transactional(timeout 5) // 5秒超时 public void batchUpdateUsers(ListUser users) { users.forEach(user - { userMapper.update(user); }); }5.3 保存点应用复杂事务中实现部分回滚Transactional public void complexOperation(User user) { // 操作1 userMapper.update(user); // 设置保存点 Object savepoint TransactionAspectSupport.currentTransactionStatus().createSavepoint(); try { // 操作2 roleMapper.clearRoles(user.getId()); } catch (Exception e) { // 回滚到保存点 TransactionAspectSupport.currentTransactionStatus().rollbackToSavepoint(savepoint); } }6. 真实业务场景扩展6.1 分布式事务考量在微服务架构下可结合Seata实现分布式事务GlobalTransactional public void distributedUpdate(User user) { // 本地事务 userService.update(user); // 远程调用 authFeignClient.updateAuth(user.getAuth()); }6.2 事件发布模式在事务成功后发送领域事件Transactional public void updateWithEvent(User user) { userMapper.update(user); // 事务事件注册 TransactionSynchronizationManager.registerSynchronization( new TransactionSynchronization() { Override public void afterCommit() { eventPublisher.publishEvent(new UserUpdatedEvent(user)); } }); }实际项目中我们曾遇到用户权限缓存与数据库不一致的问题。解决方案是在事务提交后通过上述事件机制异步刷新缓存既保证了数据一致性又避免了长事务问题。

相关文章:

用SpringBoot的@Transactional注解,搞定一个完整的用户权限更新业务(含MyBatis)

用SpringBoot的Transactional注解构建高可靠用户权限更新服务 在用户管理系统开发中,权限更新往往涉及多表联动操作——更新用户基础信息的同时,可能需要调整角色关联、刷新权限列表。这种"要么全部成功,要么全部失败"的业务场景&a…...

局部与全局优化算法:原理、应用与最佳实践

1. 优化问题概述:局部与全局视角在工程实践和科学研究中,我们经常需要寻找某个系统的最佳配置或参数组合——这个过程就是优化。想象你正在调整收音机的旋钮寻找最清晰的信号:当你微调旋钮时,可能会在某个位置听到相对清晰的声音&…...

如何用铜钟音乐打造无干扰的纯净音乐体验?

如何用铜钟音乐打造无干扰的纯净音乐体验? 【免费下载链接】tonzhon-music 铜钟 Tonzhon (tonzhon.whamon.com): 干净纯粹的音乐平台 (铜钟已不再使用 tonzhon.com,现在的 tonzhon.com 不是正版的铜钟) 项目地址: https://gitcode.com/GitHub_Trending…...

小米路由器WiFi下电脑互ping失败?别急着换设备,先检查这个隐藏的加密设置

小米路由器局域网设备互访失败?可能是加密协议在"作怪" 家里用小米路由器的朋友,有没有遇到过这样的场景:明明所有设备都连着同一个WiFi,电脑却死活ping不通NAS,手机看不到电视的投屏选项,游戏联…...

HFSS布尔运算实战:用‘相减’和‘合并’搞定复杂T型波导建模,附赠变量Offset使用技巧

HFSS布尔运算实战:用‘相减’和‘合并’搞定复杂T型波导建模,附赠变量Offset使用技巧 在电磁仿真领域,HFSS作为行业标杆工具,其建模能力直接决定了仿真精度与效率。对于中级用户而言,掌握布尔运算技巧是突破建模瓶颈的…...

深度解析Neper高级功能:多晶体建模实战配置指南

深度解析Neper高级功能:多晶体建模实战配置指南 【免费下载链接】neper Polycrystal generation and meshing 项目地址: https://gitcode.com/gh_mirrors/nep/neper Neper是一款专业的多晶体生成与网格划分开源软件,专为材料科学研究提供高效的多…...

别再乱放文件了!UniAPP项目目录结构保姆级指南(附最佳实践与自建文件夹说明)

UniAPP项目目录结构优化指南:从混乱到清晰的最佳实践 刚接触UniAPP的开发者常常会陷入一个困境:随着项目规模扩大,文件越来越多,最终整个项目变成难以维护的"垃圾堆"。这种情况往往源于对目录结构理解不足和缺乏前期规划…...

给《饥荒联机版》自制一件新衣服:从零开始的Mod制作保姆级教程(附完整代码与贴图处理)

从零开始为《饥荒联机版》制作服装Mod:手把手教你打造专属角色造型 在《饥荒联机版》的世界里,角色造型的个性化是许多玩家追求的游戏乐趣之一。虽然游戏本身提供了不少服装选择,但自己动手为角色设计一件独一无二的衣服,无疑能带…...

终极免费音频转换器fre:ac:5分钟从新手到高手的完整指南 [特殊字符]

终极免费音频转换器fre:ac:5分钟从新手到高手的完整指南 🎯 【免费下载链接】freac The fre:ac audio converter project 项目地址: https://gitcode.com/gh_mirrors/fr/freac 你是否还在为音频格式不兼容而烦恼?想要把CD音乐转换成数…...

量子纠错技术:从比特到高维系统的演进与实践

1. 量子纠错基础:从比特到高维系统的范式演进量子计算的核心挑战在于量子态的脆弱性——环境噪声和操作误差会迅速破坏量子信息。我在IBM量子云平台上的实验数据显示,未经保护的量子比特在100次门操作后保真度就会降至50%以下。量子纠错码(QE…...

别再死记硬背了!用动画图解二叉排序树的插入与删除(附C++代码调试技巧)

动画拆解二叉排序树:从插入删除到调试实战 二叉排序树是数据结构中最经典的平衡与搜索思想的结合体,但很多初学者在理解插入和删除操作时,常常陷入机械记忆的困境。本文将通过动画分步演示和IDE调试技巧,带您真正掌握二叉排序树的…...

nli-MiniLM2-L6-H768惊艳呈现:Web界面交互式NLI判断全过程演示

nli-MiniLM2-L6-H768惊艳呈现:Web界面交互式NLI判断全过程演示 1. 认识自然语言推理服务 自然语言推理(Natural Language Inference, NLI)是自然语言处理中的一项重要任务,它能够判断两个句子之间的逻辑关系。nli-MiniLM2-L6-H768是一个轻量级但功能强…...

小白友好!FireRedASR-AED-L语音识别工具,可视化界面操作超简单

小白友好!FireRedASR-AED-L语音识别工具,可视化界面操作超简单 1. 工具简介:零门槛的语音识别神器 语音识别技术听起来很高深?FireRedASR-AED-L工具彻底改变了这一认知。这个基于1.1B参数大模型开发的本地语音识别工具&#xff…...

掌握GitHub加速技术:构建高效开发环境的完整解决方案

掌握GitHub加速技术:构建高效开发环境的完整解决方案 【免费下载链接】Fast-GitHub 国内Github下载很慢,用上了这个插件后,下载速度嗖嗖嗖的~! 项目地址: https://gitcode.com/gh_mirrors/fa/Fast-GitHub 对于国内开发者而…...

告别数据线!手把手教你用Windows 10的WiFi Direct直连手机传文件

告别数据线!Windows 10 WiFi Direct直连手机传文件全攻略 每次想从手机传几张照片到电脑,翻箱倒柜找数据线的经历实在太恼火。要么线太短够不着插座,要么接口不匹配——Type-C、Lightning、Micro USB各种规格让人抓狂。更别提那些需要紧急传文…...

Python之Await 协议

一、先澄清:await 到底在干什么 很多初学者会把 await 理解成“阻塞到结果返回”。这个理解不准确。 在同步代码里,函数调用通常意味着当前线程一路执行到底,中间不能主动把控制权让给别的任务;而在异步代码里,await 的…...

各种软件免费版本安装-软件管家@资源目录#-最新有用网址——

各种软件免费版本安装-软件管家资源目录#-最新有用网址—— 软件管家资源目录# 软件管家资源目录#...

TEKLauncher技术架构深度解析:模块化游戏启动器实现原理揭秘

TEKLauncher技术架构深度解析:模块化游戏启动器实现原理揭秘 【免费下载链接】TEKLauncher Launcher for ARK: Survival Evolved 项目地址: https://gitcode.com/gh_mirrors/te/TEKLauncher TEKLauncher作为《方舟:生存进化》的专业级游戏启动器&…...

Linux文件系统 dentry cache 机制与性能优化探秘

1. 从文件路径到磁盘数据:dentry cache的核心作用 当你敲下ls /home/user/docs命令时,系统如何在毫秒内完成这个看似简单的操作?背后正是Linux的dentry cache(目录项缓存)在默默发力。这个机制就像城市里的路标系统&am…...

Android Studio中文语言包:打破语言障碍,专注移动开发

Android Studio中文语言包:打破语言障碍,专注移动开发 【免费下载链接】AndroidStudioChineseLanguagePack AndroidStudio中文插件(官方修改版本) 项目地址: https://gitcode.com/gh_mirrors/an/AndroidStudioChineseLanguagePack 在A…...

Sigma-Delta ADC选型避坑:为什么ADS124S08的‘低延迟滤波器’才是多通道轮询采集的正确打开方式

Sigma-Delta ADC选型避坑:为什么ADS124S08的‘低延迟滤波器’才是多通道轮询采集的正确打开方式 在工业传感器网络和自动化控制系统中,多通道数据采集的实时性往往比单一通道的极致精度更为关键。许多工程师在选型Sigma-Delta ADC时容易陷入一个典型误区…...

如何永久保存微信聊天记录?完整指南教你三步导出与分析

如何永久保存微信聊天记录?完整指南教你三步导出与分析 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/we/WeCh…...

录播姬全攻略:3分钟上手,24小时守护你心爱的直播内容

录播姬全攻略:3分钟上手,24小时守护你心爱的直播内容 【免费下载链接】BililiveRecorder 录播姬 | mikufans 生放送录制 项目地址: https://gitcode.com/gh_mirrors/bi/BililiveRecorder 你是否曾经因为错过心爱主播的直播而遗憾?或者…...

QrazyBox终极指南:3分钟快速修复损坏二维码的完整教程

QrazyBox终极指南:3分钟快速修复损坏二维码的完整教程 【免费下载链接】qrazybox QR Code Analysis and Recovery Toolkit 项目地址: https://gitcode.com/gh_mirrors/qr/qrazybox 你是否遇到过打印模糊的二维码无法扫描?或者手机拍摄的付款码因为…...

3分钟完成B站缓存转换:m4s无损转MP4的完整解决方案

3分钟完成B站缓存转换:m4s无损转MP4的完整解决方案 【免费下载链接】m4s-converter 一个跨平台小工具,将bilibili缓存的m4s格式音视频文件合并成mp4 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter 你是否曾经遇到过这样的困境&…...

烽火HG5143D光猫折腾实录:用Fiddler抓包+U盘拷贝,手把手教你拿到超级密码

烽火HG5143D光猫深度探索:从抓包分析到权限获取的完整实践 家里刚升级了电信宽带,配套的烽火HG5143D光猫却成了网络自由的第一道障碍。这款设备默认采用网关模式,让很多高级网络功能无法施展。经过几天的摸索,我发现了一套相对可靠…...

终极指南:如何用BetterJoy在PC上完美使用Switch控制器玩模拟器游戏

终极指南:如何用BetterJoy在PC上完美使用Switch控制器玩模拟器游戏 【免费下载链接】BetterJoy Allows the Nintendo Switch Pro Controller, Joycons and SNES controller to be used with CEMU, Citra, Dolphin, Yuzu and as generic XInput 项目地址: https://…...

2026届最火的十大降重复率平台推荐榜单

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 伴随人工智能技术凭借迅猛之势飞速发展,AI工具于毕业论文写作领域里的应用展现出…...

解密Interceptor:突破Windows输入模拟技术瓶颈的驱动层解决方案

解密Interceptor:突破Windows输入模拟技术瓶颈的驱动层解决方案 【免费下载链接】Interceptor C# wrapper for a Windows keyboard driver. Can simulate keystrokes and mouse clicks in protected areas like the Windows logon screen (and yes, even in games).…...

2025届毕业生推荐的降AI率工具实际效果

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 人工智能技术迅猛发展,给毕业论文撰写提供了全新智能化支持,借助自然…...