Spring实现MySQL事务操作
一、创建数据库表
表名:account
字段:(`id`,`username`,`money`)
二、dao、service层创建业务接口、类
1 public interface UserDao {
2 void addMoney();
3 void reduceMoney();
4 }
1 @Repository
2 public class UserDaoImpl implements UserDao {
3
4 @Autowired
5 private JdbcTemplate jdbcTemplate;
6
7 @Override
8 public void addMoney() {
9 String sql = "update account set money = money + ? where username = ?";
10 jdbcTemplate.update(sql,101,"zhangsan");
11 }
12
13 @Override
14 public void reduceMoney() {
15 String sql = "update account set money = money - ? where username = ?";
16 jdbcTemplate.update(sql,102,"lisi");
17 }
18 }
三、注解形式实现事务管理
1 @Service
2 @Transactional
3 public class UserService {
4
5 @Autowired
6 UserDao userDao;
7
8 public void accountMoney() {
9 userDao.reduceMoney();
10 // 模拟异常
11 int i = 10 / 0;
12 userDao.addMoney();
13 }
14 }
bean.xml
1 <?xml version="1.0" encoding="UTF-8"?>
2 <beans xmlns="http://www.springframework.org/schema/beans"
3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4 xmlns:context="http://www.springframework.org/schema/context"
5 xmlns:tx="http://www.springframework.org/schema/tx"
6 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
7 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
8 http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
9 ">
10 <!-- 数据库连接池 -->
11 <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
12 <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
13 <property name="url" value="jdbc:mysql://localhost:3306/test"></property>
14 <property name="username" value="root"></property>
15 <property name="password" value="root"></property>
16 </bean>
17 <!-- JdbcTemplate对象 -->
18 <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
19 <!--注入dataSource-->
20 <property name="dataSource" ref="dataSource"></property>
21 </bean>
22 <!-- 组件扫描 -->
23 <context:component-scan base-package="com.example"></context:component-scan>
24
25 <!-- 创建事务管理器 -->
26 <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
27 <!--注入数据源-->
28 <property name="dataSource" ref="dataSource"></property>
29 </bean>
30 <!-- 开启事务注解 -->
31 <tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>
32 </beans>
四、XML配置文件实现声明式事务管理
1 <?xml version="1.0" encoding="UTF-8"?>
2 <beans xmlns="http://www.springframework.org/schema/beans"
3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4 xmlns:context="http://www.springframework.org/schema/context"
5 xmlns:tx="http://www.springframework.org/schema/tx"
6 xmlns:aop="http://www.springframework.org/schema/aop"
7 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
8 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
9 http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
10 http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
11 ">
12
13 <!-- 数据库连接池 -->
14 <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
15 <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
16 <property name="url" value="jdbc:mysql://localhost:3306/test"></property>
17 <property name="username" value="root"></property>
18 <property name="password" value="root"></property>
19 </bean>
20
21 <!-- JdbcTemplate对象 -->
22 <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
23 <!--注入dataSource-->
24 <property name="dataSource" ref="dataSource"></property>
25 </bean>
26
27 <!-- 组件扫描 -->
28 <context:component-scan base-package="com.example"></context:component-scan>
29
30 <!-- 1. 创建事务管理器 -->
31 <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
32 <!--注入数据源-->
33 <property name="dataSource" ref="dataSource"></property>
34 </bean>
35
36 <!-- 2. 配置通知 -->
37 <tx:advice id="txadvice">
38 <!-- 配置事务参数 -->
39 <tx:attributes>
40 <!-- 指定哪种规则的方法上面添加事务 -->
41 <tx:method name="accountMoney" propagation="REQUIRED"/>
42 <!--<tx:method name="account*"/>-->
43 </tx:attributes>
44 </tx:advice>
45
46 <!-- 3. 配置切入点和切面 -->
47 <aop:config>
48 <!-- 配置切入点 -->
49 <aop:pointcut id="pt" expression="execution(* com.example.demo.service.UserService.*(..))"/>
50 <!-- 配置切面 -->
51 <aop:advisor advice-ref="txadvice" pointcut-ref="pt"></aop:advisor>
52 </aop:config>
53
54 </beans>
五、完全注解实现事务管理
使用配置类代替xml文件
dao、service 使用步骤二、三中的例子
1 @Configuration // 配置类
2 @ComponentScan(basePackages = "com.example") // 扫描包
3 @EnableTransactionManagement //开启事务
4 public class TxConfig {
5
6 /**
7 * 创建数据库连接池
8 */
9 @Bean
10 public DruidDataSource getDruidDataSource() {
11 DruidDataSource dataSource = new DruidDataSource();
12 dataSource.setDriverClassName("com.mysql.jdbc.Driver");
13 dataSource.setUrl("jdbc:mysql://localhost:3306/test");
14 dataSource.setUsername("root");
15 dataSource.setPassword("root");
16 return dataSource;
17 }
18
19 /**
20 * 创建JdbcTemplate对象
21 */
22 @Bean
23 public JdbcTemplate getJdbcTemplate(DataSource dataSource) {
24 // 到IOC容器中根据类型找到dataSource
25 JdbcTemplate jdbcTemplate = new JdbcTemplate();
26 // 注入dataSource
27 jdbcTemplate.setDataSource(dataSource);
28 return jdbcTemplate;
29 }
30
31 /**
32 * 创建事务管理器
33 */
34 @Bean
35 public DataSourceTransactionManager getDataSourceTransactionManager(DataSource dataSource) {
36 DataSourceTransactionManager transactionManager = new DataSourceTransactionManager();
37 transactionManager.setDataSource(dataSource);
38 return transactionManager;
39 }
40
41 }
六、测试
使用xml配置文件实现事务管理时使用 new ClassPathXmlApplicationContext("bean.xml")加载配置文件;
使用完全注解实现事务管理时使用 new AnnotationConfigApplicationContext(TxConfig.class)加载配置类。
1 @Test
2 public void accountTest2() {
3 //完全注解时的测试(加载配置类);xml配置文件测试时使用 new ClassPathXmlApplicationContext("bean.xml")加载配置文件
4 ApplicationContext context = new AnnotationConfigApplicationContext(TxConfig.class);
5 UserService userService = context.getBean("userService", UserService.class);
6 userService.accountMoney();
7 }
Spring实现MySQL事务操作的更多相关文章
- 第二百八十六节,MySQL数据库-MySQL事务操作(回滚)
MySQL数据库-MySQL事务操作(回滚) 事务用于将某些操作的多个SQL作为原子性操作,一旦有某一个出现错误,即可回滚到原来的状态,从而保证数据库数据完整性. 举例:有这样一张表 从表里可以看出张 ...
- 学习ThinkPHP的第20天--MySQL事务操作、查询事件、一对一关联
之所以从20天才开始写随笔记是因为之前没搞自己的博客 从20天开始记录我在ThinkPHP中的点点滴滴 1.MySQL事务操作 /**事务操作*/ //startTrans启动事务.rollback回 ...
- Spring中的事务操作
事务的特性 原子性:强调事务的不可分割. 一致性:事务的执行的前后数据的完整性保持一致. 隔离性:一个事务执行的过程中,不应该受到其他事务的干扰. 持久性:事务一旦结束,数据就持久化到数据库. 如果不 ...
- Spring 中的事务操作、注解、以及 XML 配置
事务 事务全称叫数据库事务,是数据库并发控制时的基本单位,它是一个操作集合,这些操作要么不执行,要么都执行,不可分割.例如我们的转账这个业务,就需要进行数据库事务的处理. 转账中至少会涉及到两条 SQ ...
- (转)Spring中的事务操作
http://blog.csdn.net/yerenyuan_pku/article/details/70024364 事务的回顾 什么是事务 事务是逻辑上的一组操作,组成这组操作的各个逻辑单元,要么 ...
- MySQL事务操作
在 MySQL 命令行的默认设置下,事务都是自动提交的,即执行 SQL 语句后就会马上执行 COMMIT 操作.因此要显式地开启一个事务务须使用命令 BEGIN 或 START TRANSACTION ...
- spring mybatis mysql 事务不起作用
之前框架事务应该是好的,不过这次做了些修改,不知如何竟然不好用了,整理了好半天,java框架配置就是吓人,有一点不熟悉的就可能暴露问题,好处是又深入的了解了配置原理. 开始以为是mysql不支持事务的 ...
- spring boot mysql 事务
mysql默认 事务自动提交.即:每条insert/update/delete语句,不需要程序手工提交事务,而是mysql自行提交了. 如果我们想实现程序事务提交,需要事先关闭mysql的自动提交事务 ...
- spring 编程式事务管理和声明式事务管理
编程式事务管理 Spring 的编程式事务管理概述 在 Spring 出现以前,编程式事务管理对基于 POJO 的应用来说是唯一选择.用过 Hibernate 的人都知道,我们需要在代码中显式调用be ...
- Spring编程式事务管理及声明式事务管理
本文将深入讲解 Spring 简单而强大的事务管理功能,包括编程式事务和声明式事务.通过对本教程的学习,您将能够理解 Spring 事务管理的本质,并灵活运用之. Spring 事务属性分析 事务管理 ...
随机推荐
- Ubuntu18.04环境下 以太坊Geth的安装
ubuntu18.04系统下安装: sudo apt-get install software-properties-common sudo add-apt-repository -y ppa:eth ...
- 再谈汤普森采样(Thompson Sampling)
相关: [转载] 推荐算法之Thompson(汤普森)采样 [转载] 推荐系统 EE 问题与 Bandit 算法 python语言绘图:绘制一组beta分布图 转载: beta分布介绍 python语 ...
- Kotlin 面向对象编程 (OOP) 基础:类、对象与继承详解
什么是面向对象编程 (OOP)? OOP 代表面向对象编程. 过程式编程是编写执行数据操作的过程或方法,而面向对象编程则是创建包含数据和方法的对象. 与过程式编程相比,面向对象编程具有以下几个优势: ...
- 电脑打不开CHM格式文件解决办法
如图所示 比如说jdk1.8的api 双击打开后,这个样子 就ok了
- SMU 2024 spring 天梯赛自主训练1
SMU 2024 spring 天梯赛自主训练1 7-1 宇宙无敌大招呼 - SMU 2024 spring 天梯赛自主训练1 (pintia.cn) #include <bits/stdc++ ...
- Atcoder ABC296 F
Atcoder ABC296 F F - Simultaneous Swap 链接: F - Simultaneous Swap (atcoder.jp) 简要题意: 问题陈述 给你两个 \(N\) ...
- WPF:MVVM的由来与属性绑定的过程
WPF:MVVM的由来与属性绑定的过程 1.MVVM (1)MVVM是什么? MVVM(Model-View-ViewModel)是一种软件架构设计模式MVVM模式.有助于分离应用程序的业务逻辑和 ...
- apr库编译及队列使用笔记
操作系统 :CentOS 7.9_x64 apr库版本:apr-1.7.4 & apr-util-1.6.3 gcc 版本:4.8.5 队列功能在C++或Python等脚本语言里面,是很容易就 ...
- 【测试平台开发】——07Vue前端框架实战——restful请求
本节主要是前后端接口的调用,以及前端如何进行封装接口 一.创建相关文件 在文件夹下创建http.js.api.js.user.js 1)http.js封装接口: 在src下创建api文件夹 添加htt ...
- 微信小程序开发工具怎样支持xdebug调试
在做PHP项目时候用xdebug进行调试,如果使用浏览器我一般直接 Xdebug Helper 浏览器插件.配合PHPSTORM进行调试. 微信小程序并不支持cookies,因此需要另想办法,可以在微 ...