Spring 事务传播属性
Spring 事务相关
3 个 API 定义类
Spring 事务底层 API 定义主要有 PlatformTransactionManager、TransactionDefintion 和 TransactionStatus。
PlatformTransactionManager 是事务管理器的顶层接口,该接口规定了事务的基本操作:获取事务、提交事务、回滚事务。
public interface PlatformTransactionManager {
TransactionStatus getTransaction(@Nullable TransactionDefinition definition) throws TransactionException;
void commit(TransactionStatus status) throws TransactionException;
void rollback(TransactionStatus status) throws TransactionException;
}
TransactionStatus 事务状态,比如是否有保存点、是否是新事务、是否设置了 Rollback 等
public interface TransactionStatus extends SavepointManager, Flushable {
boolean isNewTransaction();
boolean hasSavepoint();
void setRollbackOnly();
boolean isRollbackOnly();
@Override
void flush();
boolean isCompleted();
}
TransactionDefintion` 事务属性的定义,包含以下 5 个属性:事务传播级别、事务隔离级别、超时时间、是否为只读事务、事务配置
public interface TransactionDefinition {
int PROPAGATION_REQUIRED = 0;
int PROPAGATION_SUPPORTS = 1;
int PROPAGATION_MANDATORY = 2;
int PROPAGATION_REQUIRES_NEW = 3;
int PROPAGATION_NOT_SUPPORTED = 4;
int PROPAGATION_NEVER = 5;
int PROPAGATION_NESTED = 6;
int ISOLATION_DEFAULT = -1;
int ISOLATION_READ_UNCOMMITTED = Connection.TRANSACTION_READ_UNCOMMITTED;
int ISOLATION_READ_COMMITTED = Connection.TRANSACTION_READ_COMMITTED;
int ISOLATION_REPEATABLE_READ = Connection.TRANSACTION_REPEATABLE_READ;
int ISOLATION_SERIALIZABLE = Connection.TRANSACTION_SERIALIZABLE;
int TIMEOUT_DEFAULT = -1;
int getPropagationBehavior();
int getIsolationLevel();
int getTimeout();
boolean isReadOnly();
String getName();
}
事务隔离级别
ISOLATION_DEFAULT :默认隔离级别,对应数据源的隔离级别
ISOLATION_READ_UNCOMMITTED : 未提交读
ISOLATION_READ_COMMITTED : 提交读 (Oracle 默认)
ISOLATION_REPEATABLE_READ:可重复读(MySQL 默认)
ISOLATION_SERIALIZABLE:序列化
事务传播行为配置
NEVER :当前方法不应该在事务中,如果调用端存在事务,则抛出异常

NOT_SUPPORTED :当前方法不支持事务,如果调用端存在事务,该事务将被挂起

SUPPORTS :当前方法支持事务,调用端存在事务则在同一个事务中,如果不存在就在无事务状态中运行

REQUIRED : 当前方法必须在事务中,如果调用端有事务则被调用端将在该同一事务中进行,否则被调用端将开启一个新事务

REQUIRES_NEW : 当前方法必须在自己的事务中,如果调用端有事务时,调用端事务将被挂起,被调用端会开启自己的新事物,被调用端事务提交后,调用端事务被恢复

NESTED : 嵌套事务。被调用端的事务被嵌套在调用端事务中,如果调用端没有事务时被调用端将创建新的事务,与 REQUIRES_NEW 不同的是,当调用端发生异常时,两者都会回滚,当被调用端发生异常且异常被调用端捕获时,只有被调用端回滚,调用端不受影响

MANDATORY :强制事务。如果没有事务将抛出异常

事务传播行为示例
以下示例代码行为
class A{
@Autowired
private B b;
@Transactional(propagation = Propagation.XXX, rollbackFor = Exception.class)
void a(){
aMapper.edit();
// int i = 1 / 0;
// try{
b.b();
// } catch(Exception e){
// }
// int i = 1 / 0;
}
}
class B{
@Transactional(propagation = Propagation.XXX, rollbackFor = Exception.class)
void b(){
bMapper.edit();
// int i = 1 / 0;
}
}
AOP 代理与事务
1、由于代理机制,调用同类内部的方法时,内部方法不会被代理,所以事务的设置也不会生效
2、私有方法也不会被代理
源码解读:https://www.cnblogs.com/dennyzhangdd/p/9602673.html
事务失效:https://blog.csdn.net/j1231230/article/details/105534599
Spring 事务传播属性的更多相关文章
- spring事务传播属性和隔离级别
猫咪咪的Java世界 spring事务传播属性和隔离级别 博客分类: Spring java编程 1 事务的传播属性(Propagation) 1) REQUIRED ,这个是默认的属性 Supp ...
- Spring事务传播属性有那么难理解吗?
学习东西要知行合一,如果只是知道理论而没实践过,那么掌握的也不会特别扎实,估计过几天就会忘记,接下来我们一起实践来学习Spring事务的传播属性. 传播属性 传播属性定义的是当一个事务方法碰到另一个事 ...
- spring事务传播属性与隔离级别
一.Propagation (事务的传播属性) Propagation : key属性确定代理应该给哪个方法增加事务行为.这样的属性最重要的部份是传播行为. 有以下选项可供使用: PROPAGATIO ...
- Spring事务传播属性
Spring 对事务控制的支持统一在 TransactionDefinition 类中描述,该类有以下几个重要的接口方法: int getPropagationBehavior():事务的传播行为 i ...
- Spring事务传播属性和隔离
1 事务的传播属性(Propagation) 1) REQUIRED ,这个是默认的属性 Support a current transaction, create a new one if no ...
- Spring事务传播属性介绍(三).Nested
Required.Required_New传播属性分析传送门:https://www.cnblogs.com/lvbinbin2yujie/p/10259897.html Mandatory.Neve ...
- Spring支持的常用数据库事务传播属性和隔离级别
事务的四大特征:原子性,隔离性,持久性,一致性 spring提供了7种事务传播属性: 一个事务与其他事务的隔离程度称为隔离级别.不同隔离级别对应不同的干扰程度,隔离级别越高,数据一致性就越好,但并发性 ...
- spring常用的事务传播属性说明
事务Transaction,就是一组操作数据库的动作集合.事务是现代数据库理论中的核心概念之一.如果一组处理步骤或者全部发生或者一步也不执行,我们称该组处理步骤为一个事务.当所有的步骤像一个操作一样被 ...
- spring事务传播机制实例讲解
http://kingj.iteye.com/blog/1680350 spring事务传播机制实例讲解 博客分类: spring java历险 天温习spring的事务处理机制,总结 ...
- 实例详解 EJB 中的六大事务传播属性--转
前言 事务 (Transaction) 是访问并可能更新数据库中各种数据项的一个程序执行单元 (unit).在关系数据库中,一个事务可以是一条或一组 SQL 语句,甚至整个程序.它有通常被称为 ACI ...
随机推荐
- JAVA虚拟机02---JAVA虚拟机运行时数据区域简介
JAVA虚拟机运行时数据区域 1.程序计数器 1)它可以看做是当前线程执行的字节代码的行指示器,通过改变计数器的值来决定下一步执行的代码 2)它是线程私有的,每个线程都有自己的程序计数器(JAVA ...
- Session和Shiro的Session区别
tomcat中的session常出现为jsessionId,而shiro的session不相同,两者的id不同. 在controller中,通过 request.getSession(_) 获取会话 ...
- UBUNTU安装代码阅读器Understand
https://blog.csdn.net/weixin_40641902/article/details/79607225 1.直接下载 Understand-3.1.670-Linux-64bit ...
- windows C++
#include <Windows.h> LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lPar ...
- 郁金香 对MFC 编辑框的查看 与更改
非常简单,本来想写一个带窗口的DLL注入工具 但是进程句柄可以拿到,但是好像开辟不了空间 注入DLL进不去 不知道怎么回事 这个问题,日后解决
- Android JetPack~ ViewModel (一) 介绍与使用
Android数据绑定技术一,企业级开发 Android数据绑定技术二,企业级开发 Android JetPack~ DataBinding(数据绑定)(一) 集成与使用 Android ...
- 题解 P5072 【[Ynoi2015] 盼君勿忘】
在太阳西斜的这个世界里,置身天上之森.等这场战争结束之后,不归之人与望眼欲穿的众人, 人人本着正义之名,长存不灭的过去.逐渐消逝的未来.我回来了,纵使日薄西山,即便看不到未来,此时此刻的光辉,盼君勿忘 ...
- CSS3--通过Animation实现简单的手指点击动画
效果图 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta ...
- SpringBoot 面试问答总结(VIP典藏版),最详细!全面!爆肝!
最详细的SpringBoot面试问题干货,点赞收藏慢慢看 1.SpringBoot 面试问答总结 Spring Boot 是 Spring 开源组织下的子项目,是 Spring 组件一站式解决方案,主 ...
- Linux系统对于实施人员的价值
随着互联网的发展,linux系统越来越突显了巨大的作用,很多互联网公司,政府企业,只要用到服务器的地方几乎都能看到linux系统的身影,可以说服务是不是在linux系统跑的代表了企业的技术水平,而与l ...