提起spring事务,就会让人联想起四大基本特征,五个隔离级别,七大传播特性。相信大多数人都知道这些东西,但是知道是一回事情,能用好真的是另一回事了。在使用Spring事务的时候,我曾遇到过几个比较严肃的问题,在这里我做一个自我总结。

问题一、 propagation.NESTED和propagation.REQUIRED_NEW有什么区别?

  当调用方不存在事务的时候,两者的效果是一致的。所以这里讨论问题的前提是调用方存在事务。PROPAGATION_REQUIRES_NEW 启动一个新的, 不依赖于环境的 "内部" 事务. 这个事务将被完全 commited 或 rolled back 而不依赖于外部事务, 它拥有自己的隔离范围, 自己的锁, 等等. 当内部事务开始执行时, 外部事务将被挂起, 内务事务结束时, 外部事务将继续执行. 
另一方面, PROPAGATION_NESTED 开始一个 "嵌套的" 事务, 它是已经存在事务的一个真正的子事务. 潜套事务开始执行时, 它将取得一个 savepoint. 如果这个嵌套事务失败, 我们将回滚到此 savepoint. 潜套事务是外部事务的一部分, 只有外部事务结束后它才会被提交. 
由此可见, PROPAGATION_REQUIRES_NEW 和 PROPAGATION_NESTED 的最大区别在于, PROPAGATION_REQUIRES_NEW 完全是一个新的事务, 而 PROPAGATION_NESTED 则是外部事务的子事务, 如果外部事务 commit, 嵌套事务也会被 commit, 这个规则同样适用于 roll back.

问题二、 @Transactional为什么会失效?

  1.调用方和被调用方属于同一个component,被调用方的 @Transacational注解无效

  

package com.transacational;import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;/*** Created by chenqimiao on 17/10/31.*/
@Component
public class Service {public void test1(){test2();}@Transactional//此处的注解无效public void test2(){}
}

  2.被调用方不是一个public方法,被调用方的 @Transacational注解无效  

@Component
public class Service {@Resourceprivate Service1 service1;public void test1(){test2();service1.test3();}@Transactional//1.此处的注解无效public void test2(){}
}

package com.transacational;import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;/*** Created by chenqimiao on 17/10/31.*/
@Component
public class Service1 {@Transactional//2.此处注解无效protected void test3(){}
}

  

  3.未开启事务开关,如:在SpringBoot中,启动类未使用 @EnableTransactionManagement

问题三、 如何理解@Transactional的超时时间?

   timeout是一个供开发者设置超时时间的属性。默认值-1,超时时间由具体的sql系统决定。  

/*** Created by chenqimiao on 17/10/31.*/
@Component
public class Service3 {@Resourceprivate AdminInfoDoMapper adminInfoDoMapper;@Transactional(timeout = 4)//并不会超时public void test4(){adminInfoDoMapper.selectNameById(1);try {Thread.sleep(5000);} catch (InterruptedException e) {e.printStackTrace();}}
}

超时时间具体的定义:事务开始(在该方法第一句代码执行之前)到最后一个Statement执行完毕

所以象下面这样写,事务就会超时

@Component
public class Service3 {@Resourceprivate AdminInfoDoMapper adminInfoDoMapper;@Transactional(timeout = 4)public void test4(){try {Thread.sleep(5000);} catch (InterruptedException e) {e.printStackTrace();}adminInfoDoMapper.selectNameById(1);}
}

问题四、 @Transactional默认的回滚策略?

默认情况下,只有当RuntimeException或其子类的异常被事务捕获之后,事务才会回滚,如果要让事务能够回滚所有异常,必须手动指定  @Transactional(rollbackFor=Exception.class)  ,这样继承Exception的子类或者Exception本身都可以让事务回滚。

转载于:https://www.cnblogs.com/think-in-java/p/7764910.html

对Spring事务一些问题的讨论相关推荐

  1. Spring事务传递性探讨

    本篇主要讨论下面几点: 一: Spring 事务的传递性介绍 二: 第三方调用含有事务的Service抛异常方法探讨 一: Spring 事务的传递性介绍 事务传播行为,所谓事务的传播行为是指,如果在 ...

  2. 要不来重新认识Spring事务?三歪又学到了

    从唯一性说起 写了十几年代码,直到现在,我见过非常多的处理唯一性约束的方法都是放在代码里,而非数据库里. 直到现在我也一直很困惑,这些人为什么不使用数据库的唯一索引呢?不过我并不想知道这个答案. 他们 ...

  3. Spring事务专题(四)Spring中事务的使用、抽象机制及模拟Spring事务实现

    前言 本专题大纲如下: 事务专题大纲 「对于专题大纲我又做了调整哈,主要是希望专题的内容能够更丰富,更加详细」,本来是想在源码分析的文章中附带讲一讲事务使用中的问题,这两天想了想还是单独写一篇并作为事 ...

  4. Spring事务专题(三)事务的基本概念,Mysql事务处理原理

    我重新整理了大纲,思考了很久,决定单独将MySQL的事务实现原理跟Spring中的事务示例分为两篇文章,因为二者毕竟没有什么实际关系,实际上如果你对MySQL的事务原理不感兴趣也可以直接跳过本文,等待 ...

  5. Spring的AOP和IOC是什么?使用场景有哪些?Spring事务与数据库事务,传播行为,数据库隔离级别

    Spring的AOP和IOC是什么?使用场景有哪些?Spring事务与数据库事务,传播行为,数据库隔离级别 AOP:面向切面编程. 即在一个功能模块中新增其他功能,比方说你要下楼取个快递,你同事对你说 ...

  6. spring 事务持久性_项目学生:Spring数据的持久性

    spring 事务持久性 这是Project Student的一部分. 其他职位包括带有Jersey的Webservice Client,带有Jersey的 Webservice Server和业务层 ...

  7. Spring中事务的使用、抽象机制及模拟Spring事务实现

    本文大纲如下: Spring事务应用大纲 编程式事务 Spring提供了两种编程式事务管理的方法 使用 TransactionTemplate 或者 TransactionalOperator. 直接 ...

  8. jdbctemplate 开启事务_浅入浅出 Spring 事务传播实现原理

    本文和大家一起刨析 Spring 事务的相关源码,篇幅较长,代码片段较多,建议使用电脑阅读 本文目标 理解Spring事务管理核心接口 理解Spring事务管理的核心逻辑 理解事务的传播类型及其实现原 ...

  9. 事务例子_Spring事务专题(四)Spring中事务的使用、抽象机制及模拟Spring事务实现...

    Spring中事务的使用示例.属性及使用中可能出现的问题 前言 本专题大纲如下: 「对于专题大纲我又做了调整哈,主要是希望专题的内容能够更丰富,更加详细」,本来是想在源码分析的文章中附带讲一讲事务使用 ...

最新文章

  1. 算法设计思想(3)— 迭代法
  2. 一次失败的机巡平台对接经历分享
  3. xml c libxml类库使用
  4. 卸载linux 上Java的正确方式
  5. C#窗体中的textBox怎么设置为密码框
  6. 每周一起读 × 招募 | WWW 2019:基于层次化强化学习的多源搜索展示优化
  7. 【Java数据结构与算法】第十一章 顺序存储二叉树、线索二叉树和堆
  8. 机器学习实战8-Apriori算法
  9. Swift4.0复习Optional
  10. [学习笔记]java基础Java8SE开发环境搭建、第一个Java Hello World、Java程序的编译与执行...
  11. 633. 平方数之和
  12. VS插件——Javascript parser
  13. 200Smart PLC 与丹佛斯变频器MODBUS RTU通讯实例
  14. matlab地震频谱分析,《基于MATLAB的地震数据的分析》.doc
  15. 奖学金评审系统java_奖学金评定系统 - WEB源码|源代码 - 源码中国
  16. 记录java使用EasyExcel进行单元格内换行操作
  17. Linux I/O编程
  18. 转给身边工程师:环形穿梭车控制系统设计细节来了!
  19. 信息安全-防火墙技术原理与应用
  20. vt100 c语言控制,【转】C语言中控制printf的打印颜色实例及vt100的控制符文档

热门文章

  1. SQL 语句递归查询 With AS 查找所有子节点
  2. Day18 (一)类的加载器
  3. 蚂蚁金服CTO程立:AI尚不具备金融级的能力,开放是突破边界唯一出路
  4. Eclipse上安装springsource-tool-suite
  5. 记一次synchronized锁字符串引发的坑兼再谈Java字符串
  6. 2016年3月23日作业
  7. DATAGUARD STANDBY 服务器归档日志管理
  8. Android ListView滑动后背景变黑
  9. android 如何使用SAX解析XML
  10. String.format()的使用