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 事务传播属性的更多相关文章

  1. spring事务传播属性和隔离级别

    猫咪咪的Java世界 spring事务传播属性和隔离级别 博客分类: Spring java编程   1 事务的传播属性(Propagation) 1) REQUIRED ,这个是默认的属性 Supp ...

  2. Spring事务传播属性有那么难理解吗?

    学习东西要知行合一,如果只是知道理论而没实践过,那么掌握的也不会特别扎实,估计过几天就会忘记,接下来我们一起实践来学习Spring事务的传播属性. 传播属性 传播属性定义的是当一个事务方法碰到另一个事 ...

  3. spring事务传播属性与隔离级别

    一.Propagation (事务的传播属性) Propagation : key属性确定代理应该给哪个方法增加事务行为.这样的属性最重要的部份是传播行为. 有以下选项可供使用: PROPAGATIO ...

  4. Spring事务传播属性

    Spring 对事务控制的支持统一在 TransactionDefinition 类中描述,该类有以下几个重要的接口方法: int getPropagationBehavior():事务的传播行为 i ...

  5. Spring事务传播属性和隔离

     1 事务的传播属性(Propagation)  1) REQUIRED ,这个是默认的属性 Support a current transaction, create a new one if no ...

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

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

  7. Spring支持的常用数据库事务传播属性和隔离级别

    事务的四大特征:原子性,隔离性,持久性,一致性 spring提供了7种事务传播属性: 一个事务与其他事务的隔离程度称为隔离级别.不同隔离级别对应不同的干扰程度,隔离级别越高,数据一致性就越好,但并发性 ...

  8. spring常用的事务传播属性说明

    事务Transaction,就是一组操作数据库的动作集合.事务是现代数据库理论中的核心概念之一.如果一组处理步骤或者全部发生或者一步也不执行,我们称该组处理步骤为一个事务.当所有的步骤像一个操作一样被 ...

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

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

  10. 实例详解 EJB 中的六大事务传播属性--转

    前言 事务 (Transaction) 是访问并可能更新数据库中各种数据项的一个程序执行单元 (unit).在关系数据库中,一个事务可以是一条或一组 SQL 语句,甚至整个程序.它有通常被称为 ACI ...

随机推荐

  1. 12月2日内容总结——边框属性,display属性,css盒子模型,浮动、溢出、定位、z-index属性和建议博客页面搭建

    目录 一.边框 边框简介 border-style--边框样式 border-width--边框宽度 border-color--边框颜色 二.display属性 三.CSS盒子模型 概念 margi ...

  2. 带你动手做AI版的垃圾分类

    摘要:本案例将使用YOLOX模型,实现一个简单的垃圾分类应用. 本文分享自华为云社区<ModelBox社区案例 - 使用YOLOX做垃圾分类>,作者:HWCloudAI. 1 ModelB ...

  3. IIS服务器SSL证书安装 (pfx文件不能直接运行时)

    在证书控制台下载IIS版本证书,下载到本地的是一个压缩文件,解压后里面包含.pfx文件是证书文件,pfx_password.txt是证书文件的密码. 友情提示: 每次下载都会产生新密码,该密码仅匹配本 ...

  4. P12_小程序API的3大分类

    小程序 API 概述 小程序中的 API 是由宿主环境提供的,通过这些丰富的小程序 API,开发者可以方便的调用微信提供的能力,例如:获取用户信息.本地存储.支付功能等. 小程序 API 的 3 大分 ...

  5. Class path contains multiple SLF4J bindings解决

    1.根据控制台查看冲突的日志依赖 本工程Maven依赖 <dependencies> <dependency> <groupId>org.slf4j</gro ...

  6. PCL PointCloud类型介绍

    1. PCL PointCloud 类型介绍 在 PCL 中,PointT 是基本的点的表示形式,包括 PointXYZ.PointXYZRGB.Normal 等,而 PointCloud 则是存储点 ...

  7. STL中的智能指针(Smart Pointer)及其源码剖析: std::auto_ptr

    STL中的智能指针(Smart Pointer)及其源码剖析: std::auto_ptr auto_ptr 是STL中的智能指针家族的成员之一, 它管理由 new expression 获得的对象, ...

  8. python之路76 路飞项目 企业项目类型、软件开发流程、路飞项目需求、pip永久换源、虚拟环境、路飞项目前后端创建、包导入、后端项目目录调整

    知识获取渠道 cnblogs csdn 掘金 思否 找工作app boss直骗.拉钩.智联.猎聘.脉脉(内推,hr). 企业项目类型 1.面向互联网用户:商城类项目 微信小程序商城 2.面向互联网用户 ...

  9. Docker安装配置Oracle详细教程(以作持久化处理)

    Docker安装Oracle 1,拉取Oracle镜像,拉取成功后查看  docker pull registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11 ...

  10. 轻量级CI/CD发布部署环境搭建及使用_03_docker安装harbor

    轻量级CI/CD发布部署环境搭建及使用_03_docker安装harbor 授人以鱼不如授人以渔,如果说的别人都没明白,说明自己实际也不是太明白   1,下载docker-compose sudo c ...