spring学习JdbcTemplate数据库事务管理
作者:把苹果咬哭的测试笔记 发布时间:2024-01-28 10:46:13
标签:spring,Jdbc,Template,数据库,事务
spring JdbcTemplate数据库事务管理
现在有个账户表,里面存着用户金额。
如果要真正地做好转账的操作,就要用到事务,否则当出现异常后会出现数据不一致等问题。
try {
// 第一步 开启事务
// 第二步 进行业务操作
// 第三步 没有发生异常,提交事务
} catch(){
// 第四步 发生异常,事务回滚
}
一、spring 中的事务管理
通常,把事务加在 service 层(业务逻辑层)。
而在 spring 中管理事务可以有 2 种方式实现:
编程式管理:就像上面伪代码那样,这种使用起来不方便。
声明式管理:通过配置方式实现,推荐使用。其中,可以基于 XML 方式进行配置,也可以基于注解,显然后者更方便。
在 spring 中进行声明式事务管理,底层使用的是 AOP 原理。
二、spring 事务管理 API
spring 提供了一个接口 PlatformTransactionManager ,代表事务管理器。此接口针对不同的框架提供不同的实现类。
利用idea工具,展开结构,使用 jdbcTemplate 用到的是 DataSourceTransactionManager 。
三、使用事务管理
1. 配置文件
创建事务管理器。
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!--注入数据源-->
<property name="dataSource" ref="dataSource"></property>
</bean>
开启事务注解,使用名称空间 tx
。
<!--开启事务注释-->
<tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>
2. 类上添加事务注解
注解 @Transactional 可以加在 service 类上,也可以加到方法上:
加到类上,表示类下所有的方法都添加了事务。加到方法,表示只有该方法添加事务。
@Service
@Transactional
public class UserService {
@Autowired
private UserDao userDao;
// 转账方法
public void accountMoney() {
// 大周 少 100
userDao.reduceMoney();
// 模拟异常
int i = 1/0;
// 小毛 加 100
userDao.addMoney();
}
}
接口实现类 UserDaoImpl 。
@Repository
public class UserDaoImpl implements UserDao {
@Autowired
private JdbcTemplate jdbcTemplate;
@Override
public void addMoney() {
String sql = "update t_account set money=money+? where username=?";
jdbcTemplate.update(sql, 100, "小毛");
}
@Override
public void reduceMoney() {
String sql = "update t_account set money=money-? where username=?";
jdbcTemplate.update(sql, 100, "大周");
}
}
到测试类里执行一下:
public class TestTrans {
@Test
public void testJdbc() {
ApplicationContext context =
new ClassPathXmlApplicationContext("bean1.xml");
UserService userService = context.getBean("userService", UserService.class);
userService.accountMoney();
}
}
注意,上面的 service 里我手动添加了异常,所以执行后,事务应该是要回滚操作,2 个人的金额仍然各是 1000 。
八月 07, 2021 10:39:57 上午 com.alibaba.druid.pool.DruidDataSource info
信息: {dataSource-1} inited
java.lang.ArithmeticException: / by zero
刷新数据表。
现在我去掉 service 类中的异常 int i = 1/0;
,重新执行测试方法:
八月 07, 2021 10:47:01 上午 com.alibaba.druid.pool.DruidDataSource info
信息: {dataSource-1} inited
Process finished with exit code 0
刷新数据表。
结果正确。
来源:https://blog.csdn.net/wessonlan/article/details/124812976


猜你喜欢
- 如下所示:import numpy as np三维数组arr1 = np.arange(16).reshape((2, 2, 4)) #[[
- 引言安装或者更新完pytorch后,运行不了,显示错误:(base) xu@xusu:~$ pythonPython 3.7.1 (defa
- for循环只是一个多一点的代码,同时循环添加到它。而所涉及的一个循环的共同任务是: 设置一些计数器变量的初始值。 请检查条件语句是正确的。
- golang 中多个 defer 的执行顺序引用 Ture Go 中的一个示例:package mainimport "fmt&q
- AjaxUpload.js文件的代码,供大家参考,具体内容如下/** * AJAX Upload ( http://valums.com/
- pycharm常用快捷键1、编辑(Editing)Ctrl + Space基本的代码完成(类、方法、属性)Ctrl + Alt + Spac
- PHP5.4才支持JSON_UNESCAPED_UNICODE这个参数,此参数是让中文字符在json_encode的时候不用转义,减少数据传
- 1.问题及解决办法(1)问题:由于存储的时间戳是时间戳为GMT(格林尼治标准时间),以秒储存,但由于需要获取的是北京时间,存在时区问题。如何
- 1. 小整数对象池整数在程序中的使用非常广泛,Python为了优化速度,使用了小整数对象池, 避免为整数频繁申请和销毁内存空间。Python
- 前言在日常开发中 动画是必不可少的一部分 不仅能让元素直接的切换显得更加自然 同时也能极大的增强用户体验 因此 在Vue之中也提供了非常强大
- 在流量统计服务中都有Traffic source这个功能。Traffic source是针对访次级别的概念,换句话说,当访次建立的时候,la
- 打开文件用open,该函数创建一个文件对象,这将用来调用与之关联的其他支持方式。file object = open(file_name [
- 技术在进步,思维在发展,网页上的花样当然也要一天天地赶时髦了。在“滚动字符”、“跑马灯”已成平常的今天,网页上还能变出新花样吗?◆制作鼠标指
- 前言网易云音乐这款音乐APP本人比较喜欢,用户量也比较大,而网易云音乐之所以用户众多和它的歌曲评论功能密不可分,很多歌曲的评论非常有意思,其
- ORACLE访问SQL SERVER数据库有一篇《Oracle 异构服务实践》讲得很清楚。但里面没有讲如何设置访问多个SQL Server数
- 使用axios固定url请求前缀main.js中添加:使用方法:定义axios默认路径前缀或动态修改前缀如:每个请求url前都要加一个前缀,
- 废话不多说了,直接给大家贴代码了。编写setup.py后$ python setup.py register$ python setup.p
- python删除某个目录文件夹及文件的方法:#!/usr/bin/env pythonimport osimport shutildelLi
- 本文实例为大家分享了Python实现远程操控电脑的具体代码,供大家参考,具体内容如下import poplib import sys imp
- 目录 一、前言1.1 什么是 import 机制?1.2 import 是如何执行的?二、import 机制概览三、import