1.spring实现对事务的控制,使用的是代理的技术。通过生成的代理类来捕捉被代理类(也就是我们编写的类)的异常,决定事务的提交或回滚。从某一角度来说,spring事务是基于异常实现的。对于实现了接口的类,spring默认使用jdk动态代理进行处理,典型例子是系统的service层服务,一般都需要实现接口。对于没有实现接口的类,如web项目中的Controller,spring使用cglib进行代理。

2.最好不要在需要事务控制的方法中,调用本类的其他方法。由于该类需要spring进行事务控制,因此会生成代理类。如果是基于jdk动态代理生成的代理类,那么在被代理类中方法A用this调用该类的B方法,实际上调用的不是代理类的代理过的B方法,还是被代理类的原生B方法,这样的话,B方法上的事务不会起作用;如果使用cglib进行代理,因为cglib基于继承进行代理,this不会出现上述问题,但理论上调用私有方法时,子类对象是访问不到父类私有方法的。

总之,如果需要spring进行事务控制,那么不要在一个方法中调用同一个类中的另一个方法。

3.默认情况下,spring遇到RuntimeException才会回滚,即unchecked异常。

4.spring一共定义了七种事务传播机制:

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

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

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

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

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

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

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

其中,常用的是: 
PROPAGATION_REQUIRED,这个也是默认的传播机制;

PROPAGATION_NOT_SUPPORTED,可以用于发送提示消息,站内信、短信、邮件提示等。不属于并且不应当影响主体业务逻辑,即使发送失败也不应该对主体业务逻辑回滚。

PROPAGATION_REQUIRES_NEW,总是新启一个事务,这个传播机制适用于不受父方法事务影响的操作,比如某些业务场景下需要记录业务日志,用于异步反查,那么不管主体业务逻辑是否完成,日志都需要记录下来,不能因为主体业务逻辑报错而丢失日志;

PROPAGATION_NESTED,基于数据库savepoint实现的嵌套事务,父方法事务的commit和rollback能够控制嵌套子事务,而嵌套子事务报错时,可以选择rollback,返回原始savepoint,父事务继续执行。该传播机制可以解决发生在REQUIRED传播机制下rollback_only的问题(rollback_only的具体场景可以google一下)。

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. android开发 写一个自定义形状的按键

    步骤: 1.在drawable 文件夹中创建一个xml布局文件. 2.修改布局文件 3.在需要使用背景的按键中导入布局. 创建布局文件: 修改布局文件: <?xml version=" ...

  2. spring mvc 跨域问题。。。解决

    官方推荐方式: http://spring.io/blog/2015/06/08/cors-support-in-spring-framework 方式1: $.ajax({ //前台:常规写法.注意 ...

  3. 权限认证之OpenID-OP/RP

    OpenID规范文档中的介绍: OpenID 认证提供了一种方式,可以让用户证明自己对某个 Identifier 拥有控制权. 它不需要 Relying Party 去访问用户的凭据比如密码或者其他的 ...

  4. [Android]数据篇 --- SharedPreferences

    转载请标注:转载于http://www.cnblogs.com/Liuyt-61/p/6637515.html -------------------------------------------- ...

  5. CentOS修改locale解决调用API乱码问题

    查看所有的locale语言 locale 查看当前操作系统使用的语言 echo $LANG 永久设置系统locale语言 vi /etc/profile LANG="zh_CN.UTF-8& ...

  6. 监控hdfs 块迁移数量脚本及 metasave 日志内容详解

    把以下脚本配置到 crontab 下 ,10分钟一次,进行打点,记录复制块的进度. 想让节点快速退役(下线)的方法可以参考我的 https://www.cnblogs.com/jiangxiaoxia ...

  7. mybatis中xml文件的${}和#{}区别

    之前的笔记:#{}相当于JDBC的? ${}是字符串连接符,如果入参为普通类型{}中只写value 在项目中要实现所有业务批量提交的功能,实现方式,把表名,表主键字段当做参数传递,在xml文件中全部使 ...

  8. 机器学习入门-文本特征-word2vec词向量模型 1.word2vec(进行word2vec映射编码)2.model.wv['sky']输出这个词的向量映射 3.model.wv.index2vec(输出经过映射的词名称)

    函数说明: 1. from gensim.model import word2vec  构建模型 word2vec(corpus_token, size=feature_size, min_count ...

  9. BBS-文章详情页、点赞功能

    文章详情页--布局中header和左边区域不变--用到继承 home_site和article_detail只是布局 中心区域 只是右侧不同-----用到继承原理 -------- url # 文章详 ...

  10. Delphi 三层TDataSetProvider

    在Delphi想使用三层架构或者使用TClientDataSet控件,一般都需要引用TDataSetProvider控件,现对TDataSetProvider控件的Options属性值做一个简单的分析 ...