1、什么是事务(Transaction)?

事务是指逻辑上的一组操作,要么全部成功,要么全部失败。

  事务是指将一系列数据操作捆绑成为一个整体进行统一管理。如果某一事务执行成功,则该事务中进行的所有数据更改均会提交,成为数据库中的永久组成部分。如果事务执行时遇到错误必须取消或者回滚,则数据将全部恢复到操作前的状态,所有的数据的更改均被消除。

  

  2.事务的特性

  原子性:事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。

  一致性:事务前后的数据的完整性必须保持一致。

  隔离性:多个用户并发访问数据库,一个用户的事务的执行不能被其他事务干扰,多个并发事务之间的数据要相互隔离。

  持续性:一个事务一旦提交,它对数据库中数据的改变就应该是永久性的,即使数据库发生故障也不应该有任何影响。

  

  3.事务并发操作带来哪些问题?

    丢失修改:两个事务T1和T2读入同一个数据并修改,T2提交的结果破坏了T1提交的结果,导致T1的修改被丢失。

  脏读:一个事务读取了另一个事务改写但还未提交的数据,若这些事务被回滚,这个读取就是无效的。

  不可重复读:在同一事务中,多次读取同一数据返回的结果有所不同(读时数据发生了改变)。

  幻读:一个事务读取了几行记录后,另一个事务插入一些记录,发生幻读。后来的查询中,第一个事务发现一些原来没有的记录。

  4、Spring事务管理API(主要有3个)

  PlatformTransactionManager:事务管理器;

  TransactionDefinition:事务的定义信息(隔离,传播,超时,只读);

  TransactionStatus:保存事务具体运作状态

  5、PlatformTransactionManager 事务管理器

  spring为不同的持久化框架提供了不同的PlatformTransactionManager。

  不论 采用何种方式,都必须先创建“事务管理器”的对象。

  6、TransactionDefinition 定义事务(隔离,传播,超时,只读)

  设置隔离级别:(一组常量定义)

   

  (mysql 默认REPEATABLE_READ、oracle默认 READ_COMMITTED)

  定义事务的传播行为

  应用场景:当我们调用一个基于Spring的Service接口方法(如UserService#addUser())时,它将运行于Spring管理的事务环境中,Service接口方法可能会在内部调用其它的Service接口方法以共同完成一个完整的业务操作,因此就会产生服务接口方法嵌套调用的情况, Spring通过事务传播行为控制当前的事务如何传播到被嵌套调用的目标服务接口方法中。

  Spring在TransactionDefinition接口中规定了7种类型的事务传播行为,它们规定了事务方法和事务方法发生嵌套调用时事务如何进行传播:

  (当使用PROPAGATION_NESTED时,底层的数据源必须基于JDBC 3.0,并且实现者需要支持保存点事务机制。)

事务传播行为类型

说明

PROPAGATION_REQUIRED

如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择。

PROPAGATION_SUPPORTS

支持当前事务,如果当前没有事务,就以非事务方式执行。

PROPAGATION_MANDATORY

使用当前的事务,如果当前没有事务,就抛出异常。

PROPAGATION_REQUIRES_NEW

新建事务,如果当前存在事务,把当前事务挂起。

PROPAGATION_NOT_SUPPORTED

以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。

PROPAGATION_NEVER

以非事务方式执行,如果当前存在事务,则抛出异常。

PROPAGATION_NESTED

如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作。

  此外,还有超时时间、是否只读等相关功能。

  7、TransactionStatus:保存事务状态

  接口提供了一些方法来判断(获得)事务当前的状态:  

  void flush();冲洗数据库底层会话

  boolean hasSavePoint();返回该事务是否有一个保存点

  boolean isCompleted();返回事务是否提交或者回滚

  boolean isNewTransaction();返回是否是一个新事务

  boolean isRollbackOnly();判断这个事务是否已经设置了rollback-only。

  void setRollbackOnly();设置这个事务rollback-only。

  8、嵌套事务

  嵌套是子事务套在父事务中执行,子事务是父事务的一部分。

  在进入子事务之前,父事务建立一个回滚点,叫save point,然后执行子事务。这个子事务的执行也算是父事务的一部分,然后子事务执行结束,父事务继续执行。重点就在于那个save point,看几个问题就明白了。

  如果子事务回滚,会发生什么?
  父事务会回滚到进入子事务前建立的save point,然后尝试其他的事务或者其他的业务逻辑,父事务之前的操作不会受到影响,更不会自动回滚。

  如果父事务回滚,会发生什么?
  父事务回滚,子事务也会跟着回滚!为什么呢,因为父事务结束之前,子事务是不会提交的,我们说子事务是父事务的一部分,正是这个道理。

  那么:事务的提交,是什么情况? 是父事务先提交,然后子事务提交,还是子事务先提交,父事务再提交?
  答案是第二种情况,还是那句话,子事务是父事务的一部分,由父事务统一提交。

  9、Spring支持两种方式事务管理

  ——编程式的事务管理

    • 实际开发中很少应用
    • 通过TransactionTemplate手动管理事 

  ——使用XML配置声明事务

    • 开发中推荐使用(代码侵入性最小)
    • Spring的声明式事务是通过AOP实现

  10、声明式事务管理——XML配置(AOP思想)

  step-01  配置事务管理器——注入dataSource,确定对哪个数据库操作;

  step-02  配置事务的增强——要做的事务操作,确定进行事务操作的方法匹配规则。(隔离级别、哪个方法进行事务)

  step-03  配置切面——把通知应用到切点。

  11、声明式事务管理——注解配置

  step-01  配置事务管理器——注入dataSource,确定对哪个数据库操作;

  step-02  开启事务注解;

  step-03  在要使用事务的方法所在类上面添加注解@Transactional。

  参考:http://opiece.me/2016/03/18/spring-transactional-introduce/

  

Spring实战(十三)Spring事务的更多相关文章

  1. 【Spring实战】Spring注解配置工作原理源码解析

    一.背景知识 在[Spring实战]Spring容器初始化完成后执行初始化数据方法一文中说要分析其实现原理,于是就从源码中寻找答案,看源码容易跑偏,因此应当有个主线,或者带着问题.目标去看,这样才能最 ...

  2. 【Spring实战】Spring容器初始化完成后执行初始化数据方法

    一.背景知识及需求 在做WEB项目时,经常在项目第一次启动时利用WEB容器的监听.Servlet加载初始化等切入点为数据库准备数据,这些初始化数据是系统开始运行前必须的数据,例如权限组.系统选项.默认 ...

  3. 【转】【Spring实战】Spring注解配置工作原理源码解析

    一.背景知识 在[Spring实战]Spring容器初始化完成后执行初始化数据方法一文中说要分析其实现原理,于是就从源码中寻找答案,看源码容易跑偏,因此应当有个主线,或者带着问题.目标去看,这样才能最 ...

  4. (一)《Spring实战》——Spring核心

    <Spring实战>(第4版) 第一章:Spring之旅 1. 简化Java开发 为了降低Java开发的复杂性,Spring采取了以下4种关键策略: 基于POJO的轻量级和最小侵入性编程: ...

  5. Spring学习(十三)-----Spring 表达式语言(Spring EL)

    本篇讲述了Spring Expression Language —— 即Spring3中功能丰富强大的表达式语言,简称SpEL.SpEL是类似于OGNL和JSF EL的表达式语言,能够在运行时构建复杂 ...

  6. (二)《Spring实战》——Spring核心

    第二章:装配Bean 在Spring中,对象无需自己查找或创建与其所关联的其他对象.相反,容器负责把需要相互协作的对象引用赋予各个对象.例如,一个订单管理组件需要信用卡认证组件,但它不需要自己创建信用 ...

  7. Spring学习十三----------Spring AOP的基本概念

    © 版权声明:本文为博主原创文章,转载请注明出处 什么是AOP -面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术 -主要的功能是:日志记录.性能统计.安全控制.事务处理. ...

  8. 【Spring实战】----开篇(包含系列目录链接)

    [Spring实战]----开篇(包含系列目录链接) 置顶2016年11月10日 11:12:56 阅读数:3617 终于还是要对Spring进行解剖,接下来Spring实战篇系列会以应用了Sprin ...

  9. 手把手带你实战下Spring的七种事务传播行为

    目录 本文目录 一.什么是事务传播行为? 二.事务的7种传播行为 三.7种传播行为实战 本文介绍Spring的七种事务传播行为并通过代码演示下. 本文目录 一.什么是事务传播行为? 事务传播行为(pr ...

随机推荐

  1. Django1.6 + jQuery Ajax + JSON 实现页面局部实时刷新

    最近微信公众帐号要扩展做一个签到系统,签到结果在一个网页上实时更新,即页面局部刷新.我想用Ajax来实现,之前公众帐号是用的Django搭的,我查找了Django的官方文档,没有封装Ajax.网上有各 ...

  2. InnoDB缓存---InnoDB Buffer Pool

    InnoDB Buffer Pool 定义 对于InnoDB存储引擎,不管用户数据还是系统数据都是以页的形式存储在表空间进行管理的,其实都是存储在磁盘上的. 当InnoDB处理客户端请求,需要读取某页 ...

  3. Kafka 实践

    问题描述 配置 Kafka-client 2.x, Spring-Kafka 默认配置 Kafka 三个partition, 使用KafkaListener按group消费. 现象 某天突然发现两个p ...

  4. OUC_Summer Training_ DIV2_#11 722

    企鹅很忙系列~(可惜只会做3道题T_T) A - A Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d &am ...

  5. 处理输入为非对角阵的Clustering by fast search and find of density peak代码

    Clustering by fast search and find of density peak. Alex Rodriguez, Alessandro Laio 是发表在Science上的一篇很 ...

  6. smarty section 循环不同的四个样式

    <div class="moban_spzs"> <{section name=goodslist loop=$strdata6}> <{if $sm ...

  7. 小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_3-4.动态Sql语句Mybaties SqlProvider

    笔记 4.动态Sql语句Mybaties SqlProvider     简介:讲解什么是动态sql,及使用 1.             @UpdateProvider(type=VideoSqlP ...

  8. c语言实行泛型hashmap

    代码出处:A simple string hashmap in C  https://github.com/petewarden/c_hashmap main.c (main2是官方源代码,main是 ...

  9. iptable规则的执行顺序

    众所周知,iptable的中包含了各种各样的table和规则链条.这篇博文对规则链的执行顺序做一个简单的介绍. Chain OUTPUT (policy ACCEPT)target prot opt ...

  10. 转:使用ActiveX插件时object显示问题,div被object标签遮挡的解决方案

    起因设计要求视频控制面板显示在视频界面上,如下图红框内所示.但是因为object不在文档流之中,所以不论别的元素设置z-index多高,都只会被object元素遮住而无法看到.object元素代码如下 ...