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

教你详细使用Spring框架中编程式事务

@Resourceprivate DataSourceTransactionManager transactionManager;public AjaxResult saveTracksAndSignExpressOrder() {TransactionStatus transactionStatus = transactionManager.getTransaction(new DefaultTransactionDefinition());try {// 业务代码transactionManager.commit(transactionStatus);} catch (Exception e) {transactionManager.rollback(transactionStatus);log.error(exceptionMessage, e);return AjaxResult.error(exceptionMessage + e.getMessage());}return AjaxResult.success();}

这段代码是一个使用 DataSourceTransactionManager 进行编程式事务管理的示例,其中包含了一个名为 saveTracksAndSignExpressOrder 的方法,该方法用于保存跟踪信息并签署快递订单。以下是代码的详细解析:

注入事务管理器

@Resource
private DataSourceTransactionManager transactionManager;
  • @Resource 是Spring提供的注解,用于依赖注入。这里它被用来自动注入 DataSourceTransactionManager 的实例到 transactionManager 变量中。

开始事务

TransactionStatus transactionStatus = transactionManager.getTransaction(new DefaultTransactionDefinition());
  • 通过 transactionManager 获取一个新的 TransactionStatus 对象,表示一个新的事务开始。DefaultTransactionDefinitionTransactionDefinition 的一个实现,它定义了事务的默认属性。

业务代码执行

try {// 业务代码
}
  • try 块中,放置实际的业务逻辑代码。这些代码可能会包含数据库操作,如插入、更新或删除数据等。

提交事务

transactionManager.commit(transactionStatus);
  • 如果业务代码执行成功,没有抛出异常,那么调用 commit 方法提交事务,这会使得所有在事务中进行的数据库操作被永久保存。

异常处理和事务回滚

catch (Exception e) {transactionManager.rollback(transactionStatus);log.error(exceptionMessage, e);return AjaxResult.error(exceptionMessage + e.getMessage());
}
  • 如果在业务代码执行过程中抛出异常,那么会进入 catch 块。
  • transactionManager.rollback(transactionStatus); 回滚事务,撤销所有在事务中进行的数据库操作。
  • log.error(exceptionMessage, e); 记录异常信息到日志中。这里 exceptionMessage 应该是一个定义好的字符串变量,表示异常的描述。
  • return AjaxResult.error(exceptionMessage + e.getMessage()); 返回一个错误响应给调用者,其中包含了异常信息。

成功响应

return AjaxResult.success();
  • 如果事务成功提交,没有异常发生,那么返回一个成功的响应。

总结

这个方法通过编程式事务管理确保了数据库操作的原子性。如果在执行业务逻辑时出现异常,事务会回滚,确保数据库状态保持一致。这是处理需要多个数据库操作组合在一起作为一个单一工作单元的常见模式。


http://www.mrgr.cn/news/61838.html

相关文章:

  • 3. STM32之TIM实验--输出比较(PWM输出,电机,四轴飞行器,智能车,机器人)--(实验1:PWM驱动LED呼吸灯)
  • 基于YOLO11/v10/v8/v5深度学习的农作物类别检测与识别系统设计与实现【python源码+Pyqt5界面+数据集+训练代码】
  • 数据结构与算法-21算法专项(中文分词)(END)
  • 【STM32-HAL库】TEMT6000光照强度传感器(STM32F407ZGT6)(附带工程下载链接)
  • String-StringBuilder
  • Redis 事务 问题
  • Vue3 学习笔记(十二)侦听器详解
  • 管家婆财贸ERP BB060.销售订单导入+BB067.销售订单修改BOM类型
  • 期权懂|如何理解Black-Ssholes期权定价模型?
  • 鸿蒙生态的崛起与开发者机遇
  • 3D Gaussian Splatting代码详解(一):模型训练、数据加载
  • C++|运算符优先级
  • Doris集群搭建
  • AI如何提升Web3中的用户体验与数据管理
  • [win] 删除文件空行的方法
  • PPT批量替换字体
  • vue 实现图片预览功能并显示在弹窗的最上方
  • 批发订货系统有哪些功能 b2b网站源码哪里购买靠谱
  • 【测试平台】【前端VUE】工具页面学习记录
  • 当贝Smart1、小明Q3 Pro、大眼橙C1D对比!预算千元,哪款值得买
  • 【C++】RBTree——红黑树
  • vue3 ref和reactive踩坑
  • 如何在Linux系统中使用Ansible进行自动化部署
  • [ExoPlayer] 源码编译
  • git lfs 安装方法
  • 嵌入式软件在电子烟开发中的应用