对Spring事务一些问题的讨论
提起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事务一些问题的讨论相关推荐
- Spring事务传递性探讨
本篇主要讨论下面几点: 一: Spring 事务的传递性介绍 二: 第三方调用含有事务的Service抛异常方法探讨 一: Spring 事务的传递性介绍 事务传播行为,所谓事务的传播行为是指,如果在 ...
- 要不来重新认识Spring事务?三歪又学到了
从唯一性说起 写了十几年代码,直到现在,我见过非常多的处理唯一性约束的方法都是放在代码里,而非数据库里. 直到现在我也一直很困惑,这些人为什么不使用数据库的唯一索引呢?不过我并不想知道这个答案. 他们 ...
- Spring事务专题(四)Spring中事务的使用、抽象机制及模拟Spring事务实现
前言 本专题大纲如下: 事务专题大纲 「对于专题大纲我又做了调整哈,主要是希望专题的内容能够更丰富,更加详细」,本来是想在源码分析的文章中附带讲一讲事务使用中的问题,这两天想了想还是单独写一篇并作为事 ...
- Spring事务专题(三)事务的基本概念,Mysql事务处理原理
我重新整理了大纲,思考了很久,决定单独将MySQL的事务实现原理跟Spring中的事务示例分为两篇文章,因为二者毕竟没有什么实际关系,实际上如果你对MySQL的事务原理不感兴趣也可以直接跳过本文,等待 ...
- Spring的AOP和IOC是什么?使用场景有哪些?Spring事务与数据库事务,传播行为,数据库隔离级别
Spring的AOP和IOC是什么?使用场景有哪些?Spring事务与数据库事务,传播行为,数据库隔离级别 AOP:面向切面编程. 即在一个功能模块中新增其他功能,比方说你要下楼取个快递,你同事对你说 ...
- spring 事务持久性_项目学生:Spring数据的持久性
spring 事务持久性 这是Project Student的一部分. 其他职位包括带有Jersey的Webservice Client,带有Jersey的 Webservice Server和业务层 ...
- Spring中事务的使用、抽象机制及模拟Spring事务实现
本文大纲如下: Spring事务应用大纲 编程式事务 Spring提供了两种编程式事务管理的方法 使用 TransactionTemplate 或者 TransactionalOperator. 直接 ...
- jdbctemplate 开启事务_浅入浅出 Spring 事务传播实现原理
本文和大家一起刨析 Spring 事务的相关源码,篇幅较长,代码片段较多,建议使用电脑阅读 本文目标 理解Spring事务管理核心接口 理解Spring事务管理的核心逻辑 理解事务的传播类型及其实现原 ...
- 事务例子_Spring事务专题(四)Spring中事务的使用、抽象机制及模拟Spring事务实现...
Spring中事务的使用示例.属性及使用中可能出现的问题 前言 本专题大纲如下: 「对于专题大纲我又做了调整哈,主要是希望专题的内容能够更丰富,更加详细」,本来是想在源码分析的文章中附带讲一讲事务使用 ...
最新文章
- 算法设计思想(3)— 迭代法
- 一次失败的机巡平台对接经历分享
- xml c libxml类库使用
- 卸载linux 上Java的正确方式
- C#窗体中的textBox怎么设置为密码框
- 每周一起读 × 招募 | WWW 2019:基于层次化强化学习的多源搜索展示优化
- 【Java数据结构与算法】第十一章 顺序存储二叉树、线索二叉树和堆
- 机器学习实战8-Apriori算法
- Swift4.0复习Optional
- [学习笔记]java基础Java8SE开发环境搭建、第一个Java Hello World、Java程序的编译与执行...
- 633. 平方数之和
- VS插件——Javascript parser
- 200Smart PLC 与丹佛斯变频器MODBUS RTU通讯实例
- matlab地震频谱分析,《基于MATLAB的地震数据的分析》.doc
- 奖学金评审系统java_奖学金评定系统 - WEB源码|源代码 - 源码中国
- 记录java使用EasyExcel进行单元格内换行操作
- Linux I/O编程
- 转给身边工程师:环形穿梭车控制系统设计细节来了!
- 信息安全-防火墙技术原理与应用
- vt100 c语言控制,【转】C语言中控制printf的打印颜色实例及vt100的控制符文档