在Spring中如何手动开启事务(使用编程式事务)

这里写自定义目录标题

    • 一、使用 transactionManager
      • 1、向容器中注入事务管理器
      • 2、使用 transactionManager 提交事务
      • 3、测试
    • 二、使用TransactionTemplate
      • 1、向容器中注入 TransactionTemplate
      • 2、开启事务

一、使用 transactionManager

1、向容器中注入事务管理器

@Configuration  //配置类
public class SpringConfig {@Beanpublic DataSource getDataSource() {DruidDataSource dataSource = new DruidDataSource();dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");dataSource.setUsername("root");dataSource.setPassword("houchen");dataSource.setUrl("jdbc:mysql://192.168.239.11:3306/atguigu_spring6?characterEncoding=utf8&useSSL=false");return dataSource;}@Beanpublic DataSourceTransactionManager getDataSourceTransactionManager(DataSource dataSource) {DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager();dataSourceTransactionManager.setDataSource(dataSource);return dataSourceTransactionManager;}

2、使用 transactionManager 提交事务

    @Overridepublic void buyBook1(Integer bookId, Integer userId) {// 开启事务TransactionDefinition definition = new DefaultTransactionDefinition();TransactionStatus status = transactionManager.getTransaction(definition);try {//根据图书id查询图书价格Integer price = bookDao.getBookPriceByBookId(bookId);//更新图书表库存量 -1bookDao.updateStock(bookId);System.out.println(1 / 0);//更新用户表用户余额 -图书价格bookDao.updateUserBalance(userId, price);// 提交事务transactionManager.commit(status);} catch (Exception e) {transactionManager.rollback(status);}}

3、测试

发起请求后,报错了,但是数据库的数据并没有发生修改



二、使用TransactionTemplate

1、向容器中注入 TransactionTemplate

@Configuration  //配置类
@ComponentScan("com.atguigu.spring6.tx")
public class SpringConfig {@Beanpublic DataSource getDataSource() {DruidDataSource dataSource = new DruidDataSource();dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");dataSource.setUsername("root");dataSource.setPassword("houchen");dataSource.setUrl("jdbc:mysql://192.168.239.11:3306/atguigu_spring6?characterEncoding=utf8&useSSL=false");return dataSource;}@Beanpublic DataSourceTransactionManager getDataSourceTransactionManager(DataSource dataSource) {DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager();dataSourceTransactionManager.setDataSource(dataSource);return dataSourceTransactionManager;}@Beanpublic TransactionTemplate transactionTemplate(PlatformTransactionManager transactionManager) {return new TransactionTemplate(transactionManager);}
}

2、开启事务

  @Overridepublic void buyBook2(Integer bookId, Integer userId) {transactionTemplate.execute(transactionStatus -> {//根据图书id查询图书价格Integer price = bookDao.getBookPriceByBookId(bookId);//更新图书表库存量 -1bookDao.updateStock(bookId);System.out.println(1 / 0);//更新用户表用户余额 -图书价格bookDao.updateUserBalance(userId, price);return null;});}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/26799.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JAVA面试题整理——内存溢出与内存泄露的区别与联系

内存溢出与内存泄露的区别与联系 在前面jvm学习整理的时候其实用过一个简单的例子了解过内存溢出,在jvm内存模型章节下,大家有兴趣的可以去看看:JVM初学 GC_knowwait的博客-CSDN博客 内存溢出 内存溢出(out of memory&#xff09…

LSF 任务运行失败,为什么任务状态却为DONE ?

LSF 任务运行失败,为什么任务状态却为DONE ? 问题 用户反馈提交任务后,任务仅运行 1~2 秒后就退出,没有正常结束。但通过 bjobs 查看任务,却显示任务状态为 DONE 即正常退出。因此用户怀疑 LSF 有问题&am…

关于ReactV18的页面跳转传参和接收

一、使用路由方式进行传参和接收&#xff08;此处需使用 useNavigate 和 useParams 两个hooks&#xff09; 1 首先需要配置好路由形式如下 :id(参数) { path: "/articleDetail/:id", element: lazyElement(<ArticleDetail />), }, 2 传递参数 使用 useNaviga…

基于51单片机的智能恒温箱设计--数码管显示

一.硬件方案 根据恒温箱控制器的功能要求&#xff0c;并结合对51系列单片机软件编程自由度大&#xff0c;可用编程实现各种控制算法和逻辑控制。所以采用AT89C52作为电路系统的控制核心。按键将设置好的温度值传给单片机&#xff0c;通过温度显示模块显示出来。初始温度设置好…

php redis分布式锁

一&#xff0c;概念 在PHP中实现分布式锁通常可以使用数据库、缓存系统&#xff08;如Redis&#xff09;或者其他中央存储系统来保证在分布式系统中的数据一致性与同步。秒杀下单、抢红包等等业务场景&#xff0c;都需要用到分布式锁。 常规方案大概有七中 方案一&#xff1a;…

C# WinForm —— 34 ToolStrip 工具栏 介绍

1. 简介 工具栏 ToolStrip&#xff0c;一般紧贴在菜单栏下面 2. 属性 属性解释(Name)控件ID&#xff0c;在代码里引用的时候会用到Enabled控件是否启用Dock定义要绑定到容器的控件边框&#xff0c;默认是topAnchor定义某个控件绑定到的容器的边缘。当控件锚定到某个边缘时&a…

基于JSP技术的大学生校园兼职系统

开头语 你好呀&#xff0c;我是计算机学长猫哥&#xff01;如果有相关需求&#xff0c;可以通过文末的联系方式找到我。 开发语言 JSP 数据库 MySQL 技术 JSP JavaBeans 工具 MyEclipse、Tomcat、Navicat 系统展示 首页 学生登录界面 招聘信息界面 论坛中心界面 摘…

Page的基本使用及其原理

Paging的基本使用 1. 添加依赖 首先&#xff0c;在项目的build.gradle中添加Paging库的依赖。 dependencies { implementation androidx.paging:paging-runtime:X.X.0 // 请替换为当前最新版本 } 2. 定义数据源 创建一个数据源类&#xff0c;该类需要继承自PageKeyedDataS…

人工智能发展历程和工具搭建学习

目录 人工智能的三次浪潮 开发环境介绍 Anaconda Anaconda的下载和安装 下载说明 安装指导 模块介绍 使用Anaconda Navigator Home界面介绍 Environment界面介绍 使用Jupter Notebook 打开Jupter Notebook 配置默认目录 新建文件 两种输入模式 Conda 虚拟环境 添…

代码随想录算法训练营day44

题目&#xff1a;322. 零钱兑换、279.完全平方数、139.单词拆分、多重背包 参考链接&#xff1a;代码随想录 322. 零钱兑换 思路&#xff1a;本题同样可以用完全背包问题&#xff0c;背包容量即为amount&#xff0c;物品weight和value都为硬币coins&#xff0c;需要求的是装…

Python使用ElementTree解析xml的方法

解析XML xml.etree.ElementTree是Python标准库中用于处理XML的模块 可以通过以下语句引入 import xml.etree.ElementTree as ET解析xml时&#xff0c;可以从文件中导入&#xff0c;也可以从string获取 例如&#xff1a; # 从字符串中导入 xml_string <root><eleme…

vue国际化(中英文切换)

思路&#xff1a; 构建了一个 VueI18n 的实例&#xff0c;明确了默认与备用语言及对应的语言包。在组件中获取组件实例以方便后续操作&#xff0c;设置一个点击事件实现语言切换并触发重新获取消息的动作&#xff0c;ref 创建的 msg 用于存储消息内容&#xff0c;设置一个函数…

C++学习(19)

#学习自用# 宏 当我们编译C文件时&#xff0c;首先预处理器会过一遍所有带# 的语句&#xff08;预编译指令符号&#xff09;&#xff0c;然后进行文本替换。 #include<iostream> using namespace std; #define SQUARE(X) X*Xint main() {int a SQUARE(5);cout <&…

linux-awk分析指令

目录 基本用法: 条件语句: 内置变量: 自定义分隔符: 数学运算: 使用多个文件: 生成“完整使用报告”的示例: 8. 模式匹配 9. BEGIN和END模式 10. 数组和关联数组 11. 脚本方式使用 12. 逐行处理 13. 控制语句 awk 是一个强大的文本处理工具&#xff0c;用于在文本…

路虽远,行则将至 - 附暑期实习、秋招历程经验分享

前言 大家好 许久没有时间静下心来打开编辑器写文章了 忙碌暂过&#xff0c;难得一闲时 求学三年&#xff0c;终到离别时 回忆过往&#xff0c;枯燥且多彩 有一点经验&#xff0c;以文字形式分享&#xff0c;希望帮助到大家 可能是这段时间事多且杂&#xff0c;加上很长一…

电脑桌面上用来记事的便签软件

便签软件已成为我们日常生活中不可或缺的记录工具。想象一下&#xff0c;在繁忙的工作中&#xff0c;你突然需要记下一个重要事项或临时想法&#xff0c;这时&#xff0c;一个便捷、高效的便签软件就显得尤为重要。它能帮助我们迅速捕捉信息&#xff0c;轻松管理琐碎事务&#…

LINUX 安装JAVA

安装上传下载 yum -y install lrzsz 建存放目录 mkdir /source mkdir /source/java 进入目录&#xff0c;拖拉上传JDK 解压 tar -zxvf jdk-8u261-linux-x64.tar.gz 配置 vi /etc/profile 在末尾添加以下配置 export JAVA_HOME/source/java/jdk1.8.0_261 export JRE…

通信设备的网卡

一、网卡的作用 将计算机或者路由器连接到传输介质上的接口&#xff0c;传输介质可以是有线也可以是无线的。 &#xff08;1&#xff09;计算机的网卡 现在的计算机大多有两个网卡&#xff0c;一个是有线网卡一个无线网卡&#xff0c;比如以我们的台式电脑为例 台式电脑千兆网…

【氵】Archlinux+KDE Plasma 6+Wayland 安装nvidia驱动 / 开启HDR

参考: NVIDIA - Arch Linux 中文维基 &#xff08;其实就是把 wiki 简化了一下 注&#xff1a;本教程适用 GeForce 930 起、10 系至 20 系、 Quadro / Tesla / Tegra K-系列以及更新的显卡&#xff08;NV110 以及更新的显卡家族&#xff09;&#xff0c;此处以 RTX3060 为例 …

Scikit-learn 基础教程:机器学习的初步指南

Scikit-learn 是一个用于数据挖掘和数据分析的机器学习库&#xff0c;建立在 NumPy、SciPy 和 matplotlib 之上。它提供了简单而高效的工具来进行数据分析和建模。本文将为您介绍 Scikit-learn 的安装方法、核心组件&#xff0c;以及如何应用这些组件进行一个简单的机器学习项目…