1、事务回顾

(1)、什么是事务:

事务是逻辑上的一组操作,组成这组操作的各个逻辑单元,要么一起成功,要么一起失败。

(2)、事务特性(ACID)
  • 原子性 :强调事务的不可分割
  • 一致性 :事务的执行的前后数据的完整性保持一致
  • 隔离性 :一个事务执行的过程中,不应该受到其他事务的干扰
  • 持久性 :事务一旦结束,数据就持久到数据库
(3)、事务并发安全性问题
  • 脏读 :一个事务读到了另一个事务的未提交的数据
  • 不可重复读 :一个事务读到了另一个事务已经提交的 update 的数据导致多次查询结果不一致
  • 幻读 :一个事务读到了另一个事务已经提交的 insert 的数据导致多次查询结果不一致
(4)、事务隔离级别
  • 未提交读 :脏读,不可重复读,幻读都有可能发生
  • 已提交读 :避免脏读,但是不可重复读和幻读有可能发生
  • 可重复读 :避免脏读和不可重复读,但是幻读有可能发生
  • 串行化 :避免以上所有读问题
(5)、常见数据库默认事务隔离级别
  • MySQL:可重复读
  • Oracle:读已提交

2、Spring 事务管理

(1)、基本事务操作
  • 打开事务
  • 提交事务
  • 回滚事务
(2)、事务操作对象

Spring 事务管理中提供了 PlatformTransactionManager 接口操作事务,其中最为核心的对象是 TransactionManager 对象。

(3)、Spring 事务隔离级别
  • 读未提交
  • 读已提交
  • 可重复读
  • 串行化
(4)、Spring 事务传播行为

保证同一个事务中

  • PROPAGATION_REQUIRED :支持当前事务,如果不存在 就新建一个(默认)
  • PROPAGATION_SUPPORTS :支持当前事务,如果不存在,就不使用事务
  • PROPAGATION_MANDATORY :支持当前事务,如果不存在,抛出异常

保证不在同一个事务中

  • PROPAGATION_REQUIRES_NEW :如果有事务存在,挂起当前事务,创建一个新的事务
  • PROPAGATION_NOT_SUPPORTED :以非事务方式运行,如果有事务存在,挂起当前事务
  • PROPAGATION_NEVER :以非事务方式运行,如果有事务存在,抛出异常
  • PROPAGATION_NESTED :如果当前事务存在,则嵌套事务执行

3、Spring 事务管理方式

(1)、编码式
  • 将核心事务管理器配置到 Spring 容器
<!-- 事务核心管理器,封装了所有事务操作. 依赖于连接池 -->
<bean name="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager" >
<property name="dataSource" ref="dataSource" ></property>
</bean>
  • 配置TransactionTemplate模板
<!-- 事务模板对象 -->
<bean name="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate" >
<property name="transactionManager" ref="transactionManager" ></property>
</bean>
  • 将事务模板注入Service
<!-- 将 demoDao 和事务模板注入 Service-->
<bean name="demoService" class="com.spring.service.demoServiceImpl" >
<property name="dm" ref="demoDao" ></property>
<property name="tt" ref="transactionTemplate" ></property>
</bean>
  • 在Service中调用模板
(2)、xml 配置方式
  • 导入所需要的 jar 包和约束

  • 配置事务通知

<!-- 配置事务通知 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager" >
<tx:attributes>
<!-- 以方法为单位,指定方法应用什么事务属性
isolation:隔离级别
propagation:传播行为
read-only:是否只读
-->
<tx:method name="save*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false" />
<tx:method name="persist*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false" />
<tx:method name="update*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false" />
<tx:method name="modify*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false" />
<tx:method name="delete*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false" />
<tx:method name="remove*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false" />
<tx:method name="get*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="true" />
<tx:method name="find*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="true" />
<tx:method name="transfer" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false" />
</tx:attributes>
</tx:advice>
  • 将通知织入目标
<!-- 配置织入 -->
<aop:config >
<!-- 配置切点表达式 -->
<aop:pointcut expression="execution(*com.spring.service.*ServiceImpl.*(..))" id="txPc"/>
<!-- 配置切面 : 通知+切点
advice-ref:通知的名称
pointcut-ref:切点的名称
-->
<aop:advisor advice-ref="txAdvice" pointcut-ref="txPc" />
</aop:config>
(3)、注解配置方式
  • 导入所需要的 jar 包和约束

  • 开启注解管理事务

<!-- 开启使用注解管理事务 -->
<tx:annotation-driven/>
  • 在具体业务中使用注解

扫描关注微信公众号,了解更多

Spring 框架系列之事务管理的更多相关文章

  1. Spring框架——JDBC与事务管理

    JDBC JDBCTemplate简介 XML配置JDBCTemplate 简化JDBC模板查询 事务管理 事务简介 Spring中的事务管理器 Spring中的事务管理器的不同实现 用事务通知声明式 ...

  2. 12 Spring框架 SpringDAO的事务管理

    上一节我们说过Spring对DAO的两个支持分为两个知识点,一个是jdbc模板,另一个是事务管理. 事务是数据库中的概念,但是在一般情况下我们需要将事务提到业务层次,这样能够使得业务具有事务的特性,来 ...

  3. Spring框架系列(六)--事务Transaction

    本文绝大部分内容为转载,原文地址:https://blog.csdn.net/trigl/article/details/50968079 除此之外,后面还有延伸内容 事务在企业日常开发中几乎是一定会 ...

  4. Spring框架系列之AOP思想

    微信公众号:compassblog 欢迎关注.转发,互相学习,共同进步! 有任何问题,请后台留言联系! 1.AOP概述 (1).什么是 AOP AOP 为 Aspect Oriented Progra ...

  5. Spring5.0源码学习系列之事务管理概述

    Spring5.0源码学习系列之事务管理概述(十一),在学习事务管理的源码之前,需要对事务的基本理论比较熟悉,所以本章节会对事务管理的基本理论进行描述 1.什么是事务? 事务就是一组原子性的SQL操作 ...

  6. 全面分析 Spring 的编程式事务管理及声明式事务管理

    开始之前 关于本教程 本教程将深入讲解 Spring 简单而强大的事务管理功能,包括编程式事务和声明式事务.通过对本教程的学习,您将能够理解 Spring 事务管理的本质,并灵活运用之. 先决条件 本 ...

  7. 全面分析 Spring 的编程式事务管理及声明式事务管理--转

    开始之前 关于本教程 本教程将深入讲解 Spring 简单而强大的事务管理功能,包括编程式事务和声明式事务.通过对本教程的学习,您将能够理解 Spring 事务管理的本质,并灵活运用之. 先决条件 本 ...

  8. Spring整合hibernate4:事务管理

    Spring整合hibernate4:事务管理 Spring和Hibernate整合后,通过Hibernate API进行数据库操作时发现每次都要opensession,close,beginTran ...

  9. Spring企业级程序设计 • 【第4章 Spring持久化层和事务管理】

    全部章节   >>>> 本章目录 4.1 配置数据源资源 4.1.1 JdbcTemplate介绍 4.1.2通过ComboPooledDataSource创建数据源 4.1. ...

随机推荐

  1. Ceph,TFS,FastDFS,MogileFS,MooseFS,GlusterFS 对比

    系统整体对比 对比说明 /文件系统 TFS FastDFS MogileFS MooseFS GlusterFS Ceph 开发语言 C++ C Perl C C C++ 开源协议 GPL V2 GP ...

  2. 利用JS判断浏览器种类

    现在浏览器很多,写代码的时候常常存在兼容性问题,所以判断用户使用的浏览器很重要.userAgent带有浏览器的种类及版本号等信息,所以可以通过userAgent属性来判断.一些冷门的浏览器,可以通过打 ...

  3. 【转】linux shell 逻辑运算符、逻辑表达式详解

    shell的逻辑运算符 涉及有以下几种类型,因此只要适当选择,可以解决我们很多复杂的判断,达到事半功倍效果. 一.逻辑运算符 逻辑卷标 表示意思 1. 关于档案与目录的侦测逻辑卷标! -f 常用!侦测 ...

  4. oracle的分组查询和连接查询

    分组函数: 六个常用的分组函数: AVG,SUM,MIN,MAX,COUNT,WM_CONCAT: 行转列 PS:分组函数默认会自动过滤控制,可以使用NVL函数使分组函数无法忽略空值: 未使用NVL函 ...

  5. [SF] Symfony 组件 BrowserKit 原理

    直接看下面的注释中针对每一个文件的作用说明. <?php /** * BrowserKit - Make internal requests to your application. * * I ...

  6. Python CRM项目八

    自定义用户认证 目的:实现Django自定义的认证系统,在生产环境都是根据此代码进行定制的 步骤: 1.在settings文件中配置要使用的类 #命名规则 app名称.类名 AUTH_USER_MOD ...

  7. BZOJ 2242: [SDOI2011]计算器 [快速幂 BSGS]

    2242: [SDOI2011]计算器 题意:求\(a^b \mod p,\ ax \equiv b \mod p,\ a^x \equiv b \mod p\),p是质数 这种裸题我竟然WA了好多次 ...

  8. CF154D. Flatland Fencing [博弈论 对称 平局]

    传送门 题意: 背景是$knights' tournament$,好棒的样子! 这道题不一样很恶心的地方就是有平局的存在 首先判断能不能一步杀 不能的话,如果可以走$0$步或者$a,b$一负一正那么一 ...

  9. 数组的复制及ES6数组的扩展

    一.数组的复制 // alert([1,2,3]==[1,2,3]); let cc = [0,1,2]; let dd = cc; alert(dd==cc);//此时改变dd会影响cc ES5 只 ...

  10. 个人微信接入图灵机器人(python版)

    准备工作 itchat,requests 注册图灵账号,创建机器人,获取API-KEY 代码实现 import itchat from itchat.content import * import j ...