Spring 事务传播行为的使用

★关键日志

  事务提交日志:
    Transaction synchronization committing SqlSession
    Transaction synchronization deregistering SqlSession
    Transaction synchronization closing SqlSession
       事务回滚日志:
    Transaction synchronization resuming SqlSession
    Transaction synchronization deregistering SqlSession
    Transaction synchronization closing SqlSession

PROPAGATION详解

    不加事务:支持当前事务,如果没有事务就以非事务方式运行。

    PROPAGATION_REQUIRED -- 支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。

    PROPAGATION_SUPPORTS -- 支持当前事务(即能查询到update或insert,但是没有提交的东西--事务方法都是等方法执行完才提交), 如果当前没有事务,就以非事务方式执行。(在类中不加注解的情况下和不加事务是一样的,类中加了注解就可以加此注解来实现不加注解的情况)

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

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

    PROPAGATION_MANDATORY -- 支持当前事务,如果当前没有事务,就抛出异常。

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

    PROPAGATION_NESTED -- 如果当前存在事务,则在嵌套事务内执行,如果执行失败,内部事务(即 ServiceB#methodB) 将回滚到它执行前的 SavePoint(回滚本身)。

如果当前没有事务,则进行与PROPAGATION_REQUIRED类似的操作。

事务及嵌套事务的理解:

    1.Propagation.REQUIRED:同一个事务,一起成功或失败。注意:REQUIRED方法内的事务方法,不应该try-catch 而不抛出异常。

    2.Propagation.REQUIRES_NEW:完全是新的事务,回滚或提交不受外部影响。

    3.Propagation.NESTED的嵌套事务理解 :
      (1)回滚只是回滚内部方法本身,外部事务可以选择回滚/提交(try-catch方式处理的不同处理)
        PS:这点Propagation.REQUIRES_NEW也能做到。

      (2)外部事务提交回滚/提交,它也进行回滚/提交(它成功时的提交是在外部事务提交时)。
        PS:这点Propagation.REQUIRES_NEW做不到。

异常:Transaction rolled back because it has been marked as rollback-only原因

    1.捕获后又抛出了不回滚的异常(默认RuntimeException才回滚,而Exception不回滚)。

    2.Propagation.REQUIRED A方法调用 Propagation.REQUIRED B方法,如果捕获了B方法中的异常没有抛出 或 捕获后又抛出了不回滚的异常(默认Exception不回滚)。

Transactional的不回滚问题

    1、检查你方法是不是public的,public方法的Transactional注解才是有效的,才能控制事务。

    2、Spring默认只对UnChecked异常(RuntimeException)回滚,对于Checked(Exception)异常不回滚。
      你的异常类型是Checked异常。如果想check异常也想回滚怎么办? 
    (1)注解上加rollbackFor=Exception.class
    (2)对异常进行转换,转换成RuntimeException或自定义继承RuntimeException的异常(如承保2.0的BusinessException)

    3. 同一个类中的方法调用,内部方法的事务是没有效果的。
      如方法A没加事务,方法B中加了事务(不管加的是什么类型的事务)。方法A调用方法B,这样方法B中的事务是无效的。因为AOP只对A方法进行处理了,而不会对内部的B方法进行处理。

父类中加了Transactional注解,子类中会继承。

现象:service层继承了CommonSercice的方法默认。CommonSercice加了transaction注解,结果service层的每个方法都默认有了transaction注解(required)。

项目实践(不一定遵守,怎么方便怎么用)

    1.不在类中加@Transactional,只在用到的方法中加。

    2.不用PROPAGATION_SUPPORTS,因为效果和不加是一样的。

    3.大多数事务:PROPAGATION_REQUIRED即可满足要求,要有rollbackFor=Exception.class,格式统一如下:
      @Transactional(propagation = Propagation.REQUIRED,rollbackFor=Exception.class)

Spring 事务传播行为的使用的更多相关文章

  1. spring事务传播机制实例讲解

    http://kingj.iteye.com/blog/1680350   spring事务传播机制实例讲解 博客分类:   spring java历险     天温习spring的事务处理机制,总结 ...

  2. Spring事务传播机制

    Spring在TransactionDefinition接口中规定了7种类型的事务传播行为,它们规定了事务方法和事务方法发生嵌套调用时事务如何进行传播,即协调已经有事务标识的方法之间的发生调用时的事务 ...

  3. Spring事务传播特性的浅析——事务方法嵌套调用的迷茫

    Spring事务传播机制回顾 Spring事务一个被讹传很广说法是:一个事务方法不应该调用另一个事务方法,否则将产生两个事务.结果造成开发人员在设计事务方法时束手束脚,生怕一不小心就踩到地雷. 其实这 ...

  4. Spring事务传播机制和数据库隔离级别

    Spring事务传播机制和数据库隔离级别 转载 2010年06月26日 10:52:00 标签: spring / 数据库 / exception / token / transactions / s ...

  5. spring 事务传播机制

    spring 事务 传播机制 描述的 事务方法直接相互调用,父子事物开启,挂起,回滚 等的处理方式. 绿色的 那几个 我认为比较重要. 1 , @Transactional(propagation=P ...

  6. 事务、事务特性、事务隔离级别、spring事务传播特性

    事务.事务特性.事务隔离级别.spring事务传播特性   1.什么是事务: 事务是程序中一系列严密的操作,所有操作执行必须成功完成,否则在每个操作所做的更改将会被撤销,这也是事务的原子性(要么成功, ...

  7. 什么是事务、事务特性、事务隔离级别、spring事务传播特性

    1.什么是事务: 事务是程序中一系列严密的操作,所有操作执行必须成功完成,否则在每个操作所做的更改将会被撤销,这也是事务的原子性(要么成功,要么失败). 2.事务特性: 事务特性分为四个:原子性(At ...

  8. spring事务传播实现源码分析

    转载. https://blog.csdn.net/qpfjalzm123/article/details/83717367 本文只是对spring事务传播实现的流程进行简单的分析,如有不对之处请指出 ...

  9. Spring事务传播属性介绍(二).mandatory、not_supported、never、supports

    Required.Required_New传播属性分析传送门:https://www.cnblogs.com/lvbinbin2yujie/p/10259897.html Nested传播属性分析传送 ...

  10. Spring事务传播属性介绍(三).Nested

    Required.Required_New传播属性分析传送门:https://www.cnblogs.com/lvbinbin2yujie/p/10259897.html Mandatory.Neve ...

随机推荐

  1. 安装和使用phpstorm

    下载网址:https://www.jetbrains.com/phpstorm/ 第一步:解压在官网上所下的文件,双击 Phpstorm10.0.3.exe 第二步:安装目录选择,自定义选择安装目录, ...

  2. Html5 填表 表单(二) input type 各种输入, 各种用户选择,上传等等泛输入用户交互

    <input>        无限制输入     type    限制输入 type = 如下类型     type 后还可以跟一些属性: 如<input type=text max ...

  3. JS 对html标签的属性的干预以及JS 对CSS 样式表属性的干预

      -任何标签的任何属性都可以修改! -HTML里是怎么写, JS就怎么写   以下是一段js 作用于 css 的 href的 代码   <link id="l1" rel= ...

  4. mybatis大框架

    MyBatis   开源的数据持久化层框架 实体类与SQL语句之间建立映射关系 一:MyBatis前身是IBatis,本是Apache的一个开源的项目, 基于SQL语法,简单易学 ,是耦合度降低,方便 ...

  5. Android解析WindowManagerService(三)Window的删除过程

    前言 在本系列文章中,我提到过:Window的操作分为两大部分,一部分是WindowManager处理部分,另一部分是WMS处理部分,Window的删除过程也不例外,本篇文章会介绍Window的删除过 ...

  6. sqldataAdapter/dataset/datatable的使用

    public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Loa ...

  7. hibernate简单入门教程(一)---------基本配置

    应用级别所以很粗浅 首先介绍一下hibernate框架: 1.优秀的持久化(通俗讲把内存上的短时间运行信息存储在持久化硬盘上)框架. 2.作用于持久层,因为没什么侵入性,所以同样适用于其他层面上的存储 ...

  8. 在 Windows Server Container 中运行 Azure Storage Emulator(二):使用自定义的 SQL Server Instance

    上一节,我们解决了 Azure Storage Emulator 自定义监听地址的问题,这远远不够,因为在我们 DEV/QA 环境有各自的 SQL Server Instance,我们需要将 ASE ...

  9. MySQL 数据库 -- 操作

    初识sql语句 有了mysql这个数据库软件,就可以将程序员从对数据的管理中解脱出来,专注于对程序逻辑的编写. SQL语言主要用于存取数据.查询数据.更新数据和管理关系数据库系统,SQL语言由IBM开 ...

  10. 在IIS上发布网站后,在编译时出现CS0016拒绝访问错误

    错误如下图所示:     关键性错误信息:   编译器错误消息: CS0016: 未能写入输出文件“c:\Windows\Microsoft.NET\Framework64\v4.0.30319\Te ...