一、创建数据库表

表名: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事务操作的更多相关文章

  1. 第二百八十六节,MySQL数据库-MySQL事务操作(回滚)

    MySQL数据库-MySQL事务操作(回滚) 事务用于将某些操作的多个SQL作为原子性操作,一旦有某一个出现错误,即可回滚到原来的状态,从而保证数据库数据完整性. 举例:有这样一张表 从表里可以看出张 ...

  2. 学习ThinkPHP的第20天--MySQL事务操作、查询事件、一对一关联

    之所以从20天才开始写随笔记是因为之前没搞自己的博客 从20天开始记录我在ThinkPHP中的点点滴滴 1.MySQL事务操作 /**事务操作*/ //startTrans启动事务.rollback回 ...

  3. Spring中的事务操作

    事务的特性 原子性:强调事务的不可分割. 一致性:事务的执行的前后数据的完整性保持一致. 隔离性:一个事务执行的过程中,不应该受到其他事务的干扰. 持久性:事务一旦结束,数据就持久化到数据库. 如果不 ...

  4. Spring 中的事务操作、注解、以及 XML 配置

    事务 事务全称叫数据库事务,是数据库并发控制时的基本单位,它是一个操作集合,这些操作要么不执行,要么都执行,不可分割.例如我们的转账这个业务,就需要进行数据库事务的处理. 转账中至少会涉及到两条 SQ ...

  5. (转)Spring中的事务操作

    http://blog.csdn.net/yerenyuan_pku/article/details/70024364 事务的回顾 什么是事务 事务是逻辑上的一组操作,组成这组操作的各个逻辑单元,要么 ...

  6. MySQL事务操作

    在 MySQL 命令行的默认设置下,事务都是自动提交的,即执行 SQL 语句后就会马上执行 COMMIT 操作.因此要显式地开启一个事务务须使用命令 BEGIN 或 START TRANSACTION ...

  7. spring mybatis mysql 事务不起作用

    之前框架事务应该是好的,不过这次做了些修改,不知如何竟然不好用了,整理了好半天,java框架配置就是吓人,有一点不熟悉的就可能暴露问题,好处是又深入的了解了配置原理. 开始以为是mysql不支持事务的 ...

  8. spring boot mysql 事务

    mysql默认 事务自动提交.即:每条insert/update/delete语句,不需要程序手工提交事务,而是mysql自行提交了. 如果我们想实现程序事务提交,需要事先关闭mysql的自动提交事务 ...

  9. spring 编程式事务管理和声明式事务管理

    编程式事务管理 Spring 的编程式事务管理概述 在 Spring 出现以前,编程式事务管理对基于 POJO 的应用来说是唯一选择.用过 Hibernate 的人都知道,我们需要在代码中显式调用be ...

  10. Spring编程式事务管理及声明式事务管理

    本文将深入讲解 Spring 简单而强大的事务管理功能,包括编程式事务和声明式事务.通过对本教程的学习,您将能够理解 Spring 事务管理的本质,并灵活运用之. Spring 事务属性分析 事务管理 ...

随机推荐

  1. 【转载】 Python格式化字符串f-string概览

    版权声明:本文为CSDN博主「sunxb10」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明.原文链接:https://blog.csdn.net/sunxb10/a ...

  2. 【转载】 使用t-SNE可视化图像embedding

    原文地址: https://zhuanlan.zhihu.com/p/81400277 ================================================ t-SNE(t ...

  3. 删库了不用跑路!binlog恢复数据实操

    各位道友大家好呀! 想必道友们或多或少都听说过MySQL的binlog的作用,它记录了数据库整个的生命周期,可用于恢复数据或者从库同步数据. 那么如果发生了数据库误删,具体该怎样恢复数据呢? 下面就以 ...

  4. 同一块石头搬到了两次的List<Map> 转List<dto>的问题

    不多比比 it is shame to talking about this List<Map<String, Object>> maps = reader.readAll() ...

  5. 2024-08-14:用go语言,给定两个长度分别为n和m的整数数组nums和changeIndices,下标从1开始。初始时,nums 中所有下标均未标记。 从第1秒到第m秒,每秒可以选择以下四种操

    2024-08-14:用go语言,给定两个长度分别为n和m的整数数组nums和changeIndices,下标从1开始.初始时,nums 中所有下标均未标记. 从第1秒到第m秒,每秒可以选择以下四种操 ...

  6. Linux如何给根目录扩容内存

    第一种:LVM分区格式,就是用系统默认的自动分区格式 1.添加一块20G大小的nvme硬盘 2.启动后,查看硬盘是否已经被系统识别 3.对/dev/nvme0n2进行分区,并设置分区属性 fdisk ...

  7. SparkStreaming本地化策略性能调优与使用场景分析

    1.背景介绍:平台使用的华为FI C203的版本,通过SparkStreaming消费kafka数据后,进行算法处理入库.其中在算法部分耗时为4秒,每个批的数据量在30MB左右.执行算法部分的算子分区 ...

  8. LaTeX 三种短横线的区别

    在 LaTeX 中,有三种基本的短横线,它们各自的长度和用法都有所不同.这三种短横线分别是连字符.短划线(或数字短横)和长划线.下面是它们的具体描述和用法: 连字符 (Hyphen, '-') 用法: ...

  9. 将.gradle下的 带hash名称文件夹中的依赖 转换为 .m2上的依赖

    背景:  android studio 在无法下载依赖的情况下 , 仅 使用 mavenLocal() 本地 .gradle 下有对应依赖 , .m2下没有 故将.gradle下的 带hash名称文件 ...

  10. SpringMVC的视图

    目录 ThymeleafView 转发视图 重定向视图 视图控制器view-controller SpringMVC中的视图是View接口,视图的作用渲染数据,将模型Model中的数据展示给用户Spr ...