Spring 事务操作

一、事务(概念)

1. 什么是事务

  1. 事务是数据库的最基本单元,逻辑上的一组操作,要么都成功,如果有一个失败,那么所有的操作都失败
  2. 典型场景:
    • lucy转账100元给mary
    • lucy少100元,mary多100元

2. 事务的四个特性(ACID)

  1. 原子性(Atomicity)

  2. 一致性(Consistency)

  3. 隔离性(Isolation)

  4. 持久性(Durability)

二、事务操作

1. Spring事务管理介绍

  1. 事务添加到JavaEE三层结构里面Service层(业务逻辑层)

  2. 在Spring进行事务管理操作

    1. 编程式事务管理:就是在代码中编写代码,手动开启事务
    2. 声明式事务管理:面向切面配置事务,开启事务
  3. 声明式事务管理

    1. 基于注解方式(使用)
    2. 基于xml配置文件方式
  4. 在Spring进行声明式事务管理,底层使用AOP原理

  5. Spring事务管理API

    • 提供一个接口,代表事务管理器,这个接口针对不同的框架提供不同的实现类

2. 注解声明式事务管理

  1. 在Spring配置文件配置事务管理器

    <!-- 创建事务管理器 -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <!-- 注入数据源 -->
    <property name="dataSource" ref="dataSource"></property>
    </bean>
  2. 在Spring配置文件,开启事务注解

    1. 在spring配置文件引入名称空间tx

      <?xml version="1.0" encoding="UTF-8"?>
      <beans xmlns="http://www.springframework.org/schema/beans"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xmlns:context="http://www.springframework.org/schema/context"
      xmlns:aop="http://www.springframework.org/schema/aop"
      xmlns:tx="http://www.springframework.org/schema/tx"
      xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
      http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
      http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
      http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
    2. 开启事务注解

      <!-- 开启事务注解 -->
      <tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>
  3. 在service类什么(或者service类里面的方法上面)添加事务注解

    1. @Transaction,这个注解添加到类上面,也可以添加方法上面

    2. 如果把这个注解添加到类上面,这个类里面多有的方法都添加事务

    3. 如果把这个注解添加到方法上面,那么只是为这个方法添加事务

      @Service
      @Transaction
      public class UserService {
      ...
      }

3. 声明式事务管理参数配置

  1. 在service类声明添加注解@Transaction,这个注解里面可以配置事务相关参数

  2. propagation:事务传播行为

    1. 事务传播行为:多事务方法直接进行调用,这个过程中事务是如何进行管理的

    2. 事务方法:对数据库表的书籍进行变化的操作

    3. Spring框架事务传播行为有7种,重点掌握REQUIREDREQUIRES_NEW

      • REQUIRED:如果add方法本身有事务,调用update方法后,update使用当前add方法里面的事务;如果add方法本身没有事务,那么调用update方法之后,创建新事务

      • REQUIRES_NEW:使用add方法调用update方法,无论add方法是否有事务,update都要创建新事务,如果add方法的事务正在运行,那么update方法的事务要先挂起

  3. isolation:事务隔离级别

    1. 事务有特性成为隔离性,多事务之间操作不会产生影响。如果不考虑隔离性则会产生很多问题
    2. 有三个问题:脏读、不可重复读、幻读
    3. 脏读:在一个事务种读取到另一个未提交事务的数据

    1. 不可重复读:在一个事务种,两次查询到的结果不一致(针对update操作)

    1. 幻读:在一个事务种,两次查询到的结果不一致(针对insert操作)

    2. 如何解决这些问题?

      • 通过设置事务隔离级别,解决读问题

      • SQL标准的事务隔离级别包括:读未提交、读提交、可重复读(MySQL中默认)、串行化

        • 读未提交:一个事务还没提交时,它做的变更就能被别的事务看到
        • 读已提交:一个事务提交之后,它做的变更才能被其他事务看到
        • 可重复读:一个事务执行过程中看到的数据,总是跟这个事务在启动时看到的数据是一致的
        • 串行化:对于同一行记录,“写”会加“写锁”,“读”会加“读锁”。当出像读写锁冲突时候,后访问的事务必须等前一个事务执行完成,才能继续执行

  4. timeout:超时时间

    • 事务需要在一定的时间内进行提交,如果不提交则进行回滚
    • 默认值是-1,设置时间以秒单位进行计算
  5. readOnly:是否只读

    • 读:查询操作 写:添加、修改、删除
    • readOnly默认值是false,表示可以读,也可以写
    • readOnly设置成true,只能进行读操作,即查询
  6. rollbaclFor:回滚

    • 设置出现哪些异常进行事务回滚
  7. noRollbackFor:不回滚

    • 设置出现哪些异常不进行事务回滚

4. XML声明式事务管理

  • 在Spring配置文件中进行配置

    1. 配置事务管理器

      <!-- 1. 创建事务管理器 -->
      <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
      <property name="dataSource" ref="dataSource"></property>
      </bean>
    2. 配置通知

      <!-- 2. 配置通知 -->
      <tx:advice id="txadvice">
      <!-- 配置事务参数 -->
      <tx:attributes>
      <tx:method name="accountMoney" propagation="REQUIRED"/>
      </tx:attributes>
      </tx:advice>
    3. 配置切入点和切面

      <!-- 3. 配置切入点和切面 -->
      <aop:config>
      <!-- 配置切入点 -->
      <aop:pointcut id="pt" expression="execution(* com.atguigu.spring5.service.UserService.*(..))"/>
      <!-- 配置切面 -->
      <aop:advisor advice-ref="txadvice" pointcut-ref="pt"/>
      </aop:config>

5. 完全注解声明式事务管理

  • 创建配置类

    @Configuration // 配置类
    @ComponentScan(basePackages = "com.atguigu") // 开启组件扫描
    @EnableTransactionManagement // 开启事务
    public class TxConfig { @Bean
    public DruidDataSource getDruidDataSource() {
    DruidDataSource druidDataSource = new DruidDataSource(); druidDataSource.setDriverClassName("com.mysql.jdbc.Driver");
    druidDataSource.setUrl("jdbc:mysql://localhost:3306/spring");
    druidDataSource.setUsername("root");
    druidDataSource.setPassword("16887988hhh."); return druidDataSource;
    } // 创建JdbcTemplate对象
    @Bean(value = "jdbcTemplate")
    public JdbcTemplate getJdbcTemplate(DataSource dataSource) {
    JdbcTemplate jdbcTemplate = new JdbcTemplate(); jdbcTemplate.setDataSource(dataSource); return jdbcTemplate;
    } // 创建事务管理器
    @Bean
    public DataSourceTransactionManager getDataSourceTransactionManager(DataSource dataSource) {
    DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager(); dataSourceTransactionManager.setDataSource(dataSource); return dataSourceTransactionManager;
    }
    }

Spring笔记(五)的更多相关文章

  1. Spring 笔记 -06- 从 MySQL 建库到 登录验证数据库信息(maven)

    Spring 笔记 -06- 从 MySQL 建库到 登录验证数据库信息(maven) 本篇和 Spring 没有什么关系,只是学习 Spring,必备一些知识,所以放在这里了. 本篇内容: (1)M ...

  2. C#可扩展编程之MEF学习笔记(五):MEF高级进阶

    好久没有写博客了,今天抽空继续写MEF系列的文章.有园友提出这种系列的文章要做个目录,看起来方便,所以就抽空做了一个,放到每篇文章的最后. 前面四篇讲了MEF的基础知识,学完了前四篇,MEF中比较常用 ...

  3. 《MFC游戏开发》笔记五 定时器和简单动画

    本系列文章由七十一雾央编写,转载请注明出处. http://blog.csdn.net/u011371356/article/details/9332377 作者:七十一雾央 新浪微博:http:// ...

  4. (转)Qt Model/View 学习笔记 (五)——View 类

    Qt Model/View 学习笔记 (五) View 类 概念 在model/view架构中,view从model中获得数据项然后显示给用户.数据显示的方式不必与model提供的表示方式相同,可以与 ...

  5. java之jvm学习笔记五(实践写自己的类装载器)

    java之jvm学习笔记五(实践写自己的类装载器) 课程源码:http://download.csdn.net/detail/yfqnihao/4866501 前面第三和第四节我们一直在强调一句话,类 ...

  6. Crazyflie笔记五: CRTP 实时通信协议(一)(转)

    源:Crazyflie笔记五: CRTP 实时通信协议(一) 这里详细介绍了 Crazyflie 的 CRTP实时通信协议的相关内容,由于内容很长,分几篇博文来讲述.这里是第一节内容.欢迎交流:301 ...

  7. Learning ROS for Robotics Programming Second Edition学习笔记(五) indigo computer vision

    中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...

  8. Spring笔记02_注解_IOC

    目录 Spring笔记02 1. Spring整合连接池 1.1 Spring整合C3P0 1.2 Spring整合DBCP 1.3 最终版 2. 基于注解的IOC配置 2.1 导包 2.2 配置文件 ...

  9. Spring笔记01_下载_概述_监听器

    目录 Spring笔记01 1.Spring介绍 1.1 Spring概述 1.2 Spring好处 1.3 Spring结构体系 1.4 在项目中的架构 1.5 程序的耦合和解耦 2. Spring ...

  10. Typescript 学习笔记五:类

    中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...

随机推荐

  1. Recoil & React official state management

    Recoil & React official state management Redux Recoil.js https://recoiljs.org/ A state managemen ...

  2. Vue Learning Paths

    Vue Learning Paths Vue Expert refs https://vueschool.io/articles/vuejs-tutorials/exciting-new-featur ...

  3. js 动态修改页面文本字体

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. TypeScript——02——TS基本数据类型介绍和使用

    一,TS的数据类型 ES6的数据类型: 6种基本数据类型 Boolean Number String Symbol undefined null 3种引用类型 Array Function Objec ...

  5. RTPS解析

    资料参考: https://blog.csdn.net/HBS2011/article/details/102520704

  6. 【python】递归听了N次也没印象,读完这篇你就懂了

    听到递归总觉得挺高大上的,为什么呢?因为对其陌生,那么今天就来一文记住递归到底是个啥. 不过先别急,一起来看一个问题:求10的阶乘(10!). 求x的阶乘,其实就是从1开始依次乘到x.那么10的阶乘就 ...

  7. www.yimitv.cc免费观看2020最新电影、电视剧、综艺栏目

    神奇的微信公众号  '德佑小站', 可以看最新上映电影.看小说.看直播!重要的是免费,csdn已加速. 壹米影视:www.yimitv.cc 德佑小说:www.deyouxs.cc

  8. vue学习遇到的问题

    1.vue脚手架的安装,解决链接:https://www.cnblogs.com/qcq0703/p/14439467.html2.2.2.0+ 的版本里,当在组件上使用 v-for 时,key 现在 ...

  9. Bitter.NotifyOpenPaltform : HTTP 异步消息接收调度中心&mdash;开源贡献 之 一:简介

    现在互联网的系统越来越趋向于复杂,从单体系统到现在的微服务体系演变.公司与公司的分工也越来越明确. 大数据公司提供了大数据服务 人脸识别公司提供了人脸识别服务 OCR 公司提供了专业的OCR 服务 车 ...

  10. python进阶(7)垃圾回收机制

    Python垃圾回收 基于C语言源码底层,让你真正了解垃圾回收机制的实现 引用计数器 标记清除 分代回收 缓存机制 Python的C源码(3.8.2版本) 1.引用计数器 1.1环状双向链表 refc ...