spring开启事务

2023-05-16

文章目录

  • 1 概述
  • 2 环境准备
    • 2.1 spring整合mybatis
    • 2.2 添加dao、service(在service方法中调用dao方法实现转账效果)
    • 2.3 数据库准备
  • 3 不开启事务实现转账
    • 3.1 创建测试类(Demo)
    • 3.2 运行结果
    • 3.3 BUG
  • 4 开启事务实现转账
    • 4.1 使用`Transactional`注解开启事务
    • 4.2 设置事务管理器(在JdbcConfig中)
    • 4.3 告诉spring使用注解开启了事务
    • 4.4 运行测试类

1 概述

我们通过A向B转账500元这个例子来讲解spring如何开启事务

2 环境准备

2.1 spring整合mybatis

spring整合mybatis

2.2 添加dao、service(在service方法中调用dao方法实现转账效果)

  1. 创建AccountDao接口
package cn.qiguai.dao;

import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Update;

public interface AccountDao {
	@Update("update account set money = money - ${money} where id = ${id}")
	void reduceMoney(@Param("id") int id, @Param("money") int money);

	@Update("update account set money = money + ${money} where id = ${id}")
	void addMoney(@Param("id") int id, @Param("money") int money);
}
  1. 创建AccountService接口
package cn.qiguai.service;

public interface AccountService {
	void transfer();
}
  1. 创建AccountService接口的实现类AccountServiceImpl
package cn.qiguai.service.impl;

import cn.qiguai.dao.AccountDao;
import cn.qiguai.service.AccountService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class AccountServiceImpl implements AccountService {
	@Autowired
	private AccountDao accountDao;

	@Override
	public void transfer() {
		//A向B转账
		accountDao.reduceMoney(1, 500);
		accountDao.addMoney(2, 500);
	}
}

2.3 数据库准备

test数据库中的account表数据如下
account表数据

3 不开启事务实现转账

3.1 创建测试类(Demo)

package cn.qiguai;

import cn.qiguai.config.SpringConfig;
import cn.qiguai.service.AccountService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class Demo {
	public static void main(String[] args) {
		ApplicationContext ac = new AnnotationConfigApplicationContext(SpringConfig.class);
		AccountService accountService = ac.getBean(AccountService.class);
		accountService.transfer();
	}
}

3.2 运行结果

运行结果如下,成功实现转账
运行结果

3.3 BUG

  1. 但是在转账的过程中并不是一帆风顺的,我们来模拟一个异常
  2. 在模拟之前,我们需要将数据库数据恢复
  3. AccountServiceImpl.transfer方法中添加一个异常
package cn.qiguai.service.impl;

import cn.qiguai.dao.AccountDao;
import cn.qiguai.service.AccountService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class AccountServiceImpl implements AccountService {
	@Autowired
	private AccountDao accountDao;

	@Override
	public void transfer() {
		//A向B转账
		accountDao.reduceMoney(1, 500);
		
		//模拟异常
		int i = 1 / 0;
		
		accountDao.addMoney(2, 500);
	}
}
  1. 现在我们再次运行测试类,观察结果,我们发现账户1的钱少了,而账户2的钱并没有增加。原因是在账户1转账后发生了异常,账户2增加钱的代码没有被执行。这时候就需要开启事务,通过事务管理使用加钱和减钱同成功或同失败
    运行结果

4 开启事务实现转账

将数据库的数据恢复

4.1 使用Transactional注解开启事务

AccountService.transfer方法中使用注解开启事务

package cn.qiguai.service;

import org.springframework.transaction.annotation.Transactional;

public interface AccountService {
	@Transactional
	void transfer();
}

4.2 设置事务管理器(在JdbcConfig中)

在JdbcConfig中添加如下代码

@Bean
public PlatformTransactionManager transactionManager(DataSource ds) {
	DataSourceTransactionManager dstm = new DataSourceTransactionManager();
	
	dstm.setDataSource(ds);
	
	return dstm;
}

4.3 告诉spring使用注解开启了事务

在SpringConfig中添加EnableTransactionManagement注解

package cn.qiguai.config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.context.annotation.PropertySource;
import org.springframework.transaction.annotation.EnableTransactionManagement;

@Configuration
@ComponentScan("cn.qiguai")
@PropertySource("classpath:jdbc.properties")
@Import({JdbcConfig.class, MyBatisConfig.class})
@EnableTransactionManagement
public class SpringConfig {
}

4.4 运行测试类

观察运行结果,我们发现在发生异常后,A向B的转账并没有发生,达到预期效果
运行结果

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

spring开启事务 的相关文章

  • [C语言] [典例详解] 打印杨辉三角(找规律简单实现)

    题目 gt gt gt 用C语言打印杨辉三角 杨辉三角参考图如下 xff1a 分析 gt gt gt 于是不清楚杨辉三角的同学们可以上网查查 xff0c 可以立刻知道它的相关推理归纳和公式总结 它的简介如下 xff1a 所以我们可以使用二项
  • WampServer操作手册--转

    原链接 blog csdn net PoppinRubo article details 65627304 2017年03月24日 10 08 55 PoppinRubo 阅读数 xff1a 2191 标签 xff1a apache 更多
  • vs2015 qt链接出现MSB3758 MSB4036 这两个错误解决办法

    如果是tohashset缺少using什么的 xff0c 就把 netframework更新到4 8或者 4 7 2以上版本都可以 xff0c 在vs中帮助 gt 最下面的关于 中可以查看 net版本 xff0c 如果不是4 8就更新
  • 构建 ARM版 ubuntu18.04

    1 下载ARM ubuntu 基础版镜像 wget http cdimage ubuntu com ubuntu base releases 18 04 release ubuntu base 18 04 core armhf tar gz
  • ubuntu 14.04安装x11VNC

    环境 xff1a Ubuntu 14 04 1 xff09 安装x11vnc xff1a sudo apt get install x11vnc 2 xff09 设置VNC的连接密码 xff1a x11vnc storepasswd Ent
  • ios中几种跳转方式,普通,和StoryBoard跳转

    一 纯代码界面跳转方式 1 导航控制器 UINavigationController self navigationController pushViewController NewVC animated YES 跳转到下一界面 self
  • 【组织架构】中国铁路哈尔滨局集团有限公司

    0 参考 中国铁路哈尔滨局集团有限公司 1 公司简介 中国铁路哈尔滨局集团有限公司 xff08 China Railway Harbin Group Co Ltd xff09 xff0c 简称哈局 xff0c 是中国国家铁路集团有限公司管理
  • 【组织架构】中国铁路呼和浩特局集团有限公司

    0 参考 中国铁路呼和浩特局集团有限公司 1 公司介绍 中国铁路呼和浩特局集团有限公司 xff0c 是中国国家铁路集团有限公司管理的18个铁路局集团有限公司之一 xff0c 简称 呼局 成立于1958年11月1日 xff0c 地处内蒙古自治
  • 【组织架构】中国铁路郑州局集团有限公司

    0 参考 中国铁路郑州局集团有限公司 1 公司介绍 中国铁路郑州局集团有限公司 xff0c 是中国国家铁路集团有限公司管理的18个铁路局集团有限公司之一 xff0c 简称 郑局 正式成立于1949年3月11日 xff0c 总部位于河南省郑州
  • 【组织架构】中国铁路武汉局集团有限公司

    0 参考 中国铁路武汉局集团有限公司 1 公司介绍 中国铁路武汉局集团有限公司 xff0c 是中国国家铁路集团有限公司管理的18个铁路局集团有限公司之一 xff0c 简称 武局 成立于2005年5月18日 xff0c 是全路实行局直管站段体
  • 人工智能轨道交通行业周刊-第36期(2023.2.27-3.5)

    本期关键词 xff1a 智能高铁体系架构 广州港海铁联运 5G R 铁路受电弓 电务信号工 图像压缩 1 整理涉及公众号名单 1 1 行业类 RT轨道交通人民铁道世界轨道交通资讯网铁路信号技术交流北京铁路轨道交通网上榜铁路视点ITS Wor
  • 人工智能轨道交通行业周刊-第37期(2023.3.6-3.12)

    本期关键词 xff1a 智能天窗 广铁数字化 司机手势 编组站 AIGC 事件相机 1 整理涉及公众号名单 1 1 行业类 RT轨道交通人民铁道世界轨道交通资讯网铁路信号技术交流北京铁路轨道交通网上榜铁路视点ITS World轨道交通联盟V
  • 人工智能轨道交通行业周刊-第38期(2023.3.13-3.19)

    本期关键词 xff1a 车顶检修机器人 CTCS 机车重联作业 铁水联运 大模型 GPT 4 1 整理涉及公众号名单 1 1 行业类 RT轨道交通人民铁道世界轨道交通资讯网铁路信号技术交流北京铁路轨道交通网上榜铁路视点ITS World轨道
  • 【组织架构】中国铁路西安局集团有限公司

    0 参考 中国铁路西安局集团有限公司 1 公司介绍 中国铁路西安局集团有限公司 xff08 原西安铁路局 xff09 xff0c 是中国国家铁路集团有限公司管理的18个铁路局集团有限公司之一 xff0c 简称 西局 位于西北地区 管内有陇海
  • 【组织架构】中国铁路济南局集团有限公司

    0 参考 中国铁路济南局集团有限公司 1 公司介绍 中国铁路济南局集团有限公司 xff08 China Railway Jinan Group Co Ltd xff09 xff0c 是中国国家铁路集团有限公司管理的18个铁路局集团有限公司之
  • spark-sql处理json字符串的常用函数

    整理了spark sql处理json字符串的几个函数 xff1a 1 get json object 解析不含数组的 json 2 from json 解析json 3 schema of json 提供生成json格式的方法 4 expl
  • 【组织架构】中国铁路上海局集团有限公司

    0 参考 中国铁路上海局集团有限公司 1 公司介绍 中国铁路上海局集团有限公司成立于1994年11月15日 xff0c 注册地位于上海市静安区天目东路80号 xff0c 法定代表人为侯文玉 公司是中国国家铁路集团有限公司管理的18个铁路局集
  • 【组织架构】中国铁路南昌局集团有限公司

    0 参考 中国铁路南昌局集团有限公司 1 公司介绍 中国铁路南昌局集团有限公司 xff0c 是中国国家铁路集团有限公司管理的18个铁路局集团有限公司之一 xff0c 于2017年11月19日挂牌成立 xff0c 前身为南昌铁路局 中国铁路南
  • 【组织架构】中国铁路南宁局集团有限公司

    0 参考 中国铁路南宁局集团有限公司 1 公司介绍 中国铁路南宁局集团有限公司 xff0c 是中国国家铁路集团有限公司管理的18个铁路局集团有限公司之一 xff0c 简称 宁局 xff0c 前身是成立于1953年1月1日的柳州铁路局 xff
  • 【组织架构】中国铁路成都局集团有限公司

    0 参考 中国铁路成都局集团有限公司 1 公司介绍 中国铁路成都局集团有限公司 xff0c 是中国国家铁路集团有限公司管理的18个铁路局集团有限公司之一 xff0c 简称 成局 xff0c 地处中国西南 xff0c 管辖范围辐射四川 贵州

随机推荐

  • 【组织架构】中国铁路昆明局集团有限公司

    0 参考 中国铁路昆明局集团有限公司 1 公司介绍 中国铁路昆明局集团有限公司 xff0c 是中国国家铁路集团有限公司管理的18个铁路局集团有限公司之一 xff0c 简称 昆局 管理昆明铁路办事处以及开远铁路办事处 xff0c 路局机关设在
  • 人工智能轨道交通行业周刊-第39期(2023.3.20-3.26)

    本期关键词 xff1a 综合运维智控中心 现场防护员 模型先验知识 机器视觉照明 国铁统计公报 1 整理涉及公众号名单 1 1 行业类 RT轨道交通人民铁道世界轨道交通资讯网铁路信号技术交流北京铁路轨道交通网上榜铁路视点ITS World轨
  • Midjourney保姆级入门教程

    0 背景 在 AI 画图领域 xff0c midjourney 目前是效果最好的一个工具 xff0c 目前已经更新到 V5 版本 xff0c 生成的各种神图层出不穷 xff0c 什么国足夺冠 特朗普插秧 教皇打碟 异形下乡 只要你敢想AI就
  • 人工智能轨道交通行业周刊-第40期(2023.3.27-4.2)

    本期关键词 xff1a TACS列车 智能雄安站 火车掉头 高铁供电 AIGC发展史 1 整理涉及公众号名单 1 1 行业类 RT轨道交通人民铁道世界轨道交通资讯网铁路信号技术交流北京铁路轨道交通网上榜铁路视点ITS World轨道交通联盟
  • 人工智能轨道交通行业周刊-第41期(2023.4.3-4.9)

    本期关键词 xff1a 西安智慧车站 宁波应急保障 钢轨伸缩调节器 城轨统计报告 SAM SegGPT 1 整理涉及公众号名单 1 1 行业类 RT轨道交通人民铁道世界轨道交通资讯网铁路信号技术交流北京铁路轨道交通网上榜铁路视点ITS Wo
  • 人工智能轨道交通行业周刊-第42期(2023.4.10-4.23)

    本期关键词 xff1a 车辆智能检测 智能运维 数字孪生 无人机 信号工装备 商汤大模型 1 整理涉及公众号名单 1 1 行业类 RT轨道交通人民铁道世界轨道交通资讯网铁路信号技术交流北京铁路轨道交通网上榜铁路视点ITS World轨道交通
  • mysql视图使用

    先讲下视图的概述吧 视图是一种 虚拟表 xff0c 本身是 不具有数据 的 xff0c 占用很少的内存空间 xff0c 它是 SQL 中的一个重要概念 视图建立在已有表的基础上 视图赖以建立的这些表称为 基表 视图他自己可以被称为 从表 虚
  • 人工智能轨道交通行业周刊-第43期(2023.4.24-5.7)

    本期关键词 xff1a 综合智能检测 隧道检测 智慧城轨白皮书 虚拟编组 讯飞星火大模型 央企数字化 1 整理涉及公众号名单 1 1 行业类 RT轨道交通人民铁道世界轨道交通资讯网铁路信号技术交流北京铁路轨道交通网上榜铁路视点ITS Wor
  • kolla搭建octavia

    本文是在另外一篇文章的基础上使用kolla ansible 部署octavia实践总结 部分内容总结略有粗糙 xff0c 见谅 使用kolla ansible all in one部署OpenStack Stein https blog c
  • 关闭win10自动更新——组策略

    1 为什么要关闭自动更新 我一向是推荐关闭自动更新 xff0c 然后有时间的时候自己主动去更新 xff0c 因为win10更新还是修复了一些bug的 xff0c 但是自动更新会闹出很多问题 xff0c 例如紧急开会的时候发现电脑在自动更新
  • python 中位于运算符 & 应用

    amp 运算符在计算机中是二进制运算符 xff0c 常使用 amp 61 xff0c 即先进性位于运算符 xff0c 在进行赋值 xff0c 例如 a amp 61 b 等价于 a 61 a amp b 位于运算只二进制 保同除异 a 61
  • 【FreeRDP 】

    Ubuntu18 04安装FreeRDP 远程连接Windows桌面 1 FreeRDP2 环境3 Ubuntu安装xfreerdp4 连接准备5 连接6 问题总结 1 FreeRDP FreeRDP lt 61 61 gt Remote
  • 7-1 编写程序,输入年、月、日,计算该 日是该年的第几天。要求:计算日期、判断闰年均使用自定义函数实现。

    7 1 编写程序 xff0c 输入年 月 日 xff0c 计算该 日是该年的第几天 要求 xff1a 计算日期 判断闰年均使用自定义函数实现 编写程序 xff0c 输入年 月 日 xff0c 计算该 日是该年的第几天 要求 xff1a 计算
  • ifort + mkl + impi (全套intel)编译安装量子化学软件GAMESS 2022 R1版本

    说明 xff1a linux下编译软件都需要先配置好该软件依赖的系统环境 系统环境可以通过软件的安装说明了解 xff0c 例如 xff1a readme md等文件或网页 这个前提条件很重要 xff01 后面正式编译出错基本都可以归结到系统
  • Linux C 编程技巧--利用有限状态机模型编程

    我们知道 xff0c 一般编写程序时都要画出流程图 xff0c 按照流程图结构来编程 xff0c 如果编写一个比较繁琐 xff0c 容易思维混乱的程序时 xff0c 我们可以利用有限状态机模型画出一个状态转移图 xff0c 这样便可以利用画
  • spring读取properties文件属性,文件属性与系统属性冲突

    1 问题概述 spring在读取properties文件属性时 xff0c 当文件属性与系统属性冲突时 xff0c 会读取到系统属性值 2 问题复现 2 1 读取properties文件 创建maven工程在pom xml文件中添加spri
  • C语言实现16进制数与10进制数的转化

    C语言实现16进制数与10进制数的转化 这里有两种情况 xff1a 第一种情况 xff1a 如果我得到的是一个16进制数 xff0c 我通过肉眼看到的就是16进制显示 xff08 这里看到的肯定打印结果 xff09 xff0c 比如85 x
  • MyBatisMapper代理开发中,如何将Mapper接口和sql映射文件放置在同一目录下

    1 前言 1 1 环境准备 创建一个maven工程并导入mybatis坐标及mysql驱动坐标在java目录下创建Mapper接口在resouces目录下创建配置文件和sql映射文件 1 2 正常思维 如何将Mapper接口和sql映射文件
  • MyBatis Mapper代理开发

    文章目录 1 数据库准备2 创建一个maven项目 xff0c 导入mysql驱动坐标和mybatis坐标3 在resources目录下创建配置文件4 在resources目录下创建sql映射文件5 定义mapper接口6 修改配置文件中s
  • spring开启事务

    文章目录 1 概述2 环境准备2 1 spring整合mybatis2 2 添加dao service 在service方法中调用dao方法实现转账效果 2 3 数据库准备 3 不开启事务实现转账3 1 创建测试类 Demo 3 2 运行结