Spring超详细讲解事务

目录
  • 什么是事务
  • 事务的四个特性(ACID)
  • Spring对事务的支持
  • 编程式事务管理
  • 声明式事务管理
  • 基于注解的声明式事务管理
  • Spring事务管理的三个接口
  • Spring事务属性

什么是事务

一个数据库事务是一个被视为一个工作单元的逻辑上的一组操作,这些操作要么全部执行,要么全部不执行。

需要注意的是,并不是所有的数据库(引擎)都支持事务,比如说MySQL的MyISAM存储引擎

事务的四个特性(ACID)

原子性:事务是一个原子性操作,一个事务由一系列操作组成,这一系列操作要么全部执行完成,要么全部不执行

一致性:一个事务执行完成(不管成功还是失败),数据库的完整性不能被破坏(唯一约束,外键约束等)

隔离性:数据库允许多个并发事务同时对数据进行读写操作,隔离性可以防止这些操作同时执行时导致的数据不一致的问题。事务分为不同的隔离级别:读未提交(read uncommitted)、读已提交(read committed)、可重复读(repeatable read)和串行化(Serializable)

持久性:持久性意味着事务完成之后,该事物对数据的更改会永久的保存在数据库中。

Spring对事务的支持

Spring支持编程式事务管理和声明式事务管理两种类型的事务管理。

编程式事务管理比较灵活,但是很难维护,平时用的很少。

声明式事务管理易用性更高,侵入性、耦合度低,更推荐使用。

编程式事务管理

使用TransactionTemplate进行编程式事务管理

    @Autowired
    TransactionTemplate transactionTemplate;
    public void doTest() {
        transactionTemplate.execute(new TransactionCallbackWithoutResult() {
            @Override
            protected void doInTransactionWithoutResult(TransactionStatus transactionStatus) {
                try {
                    // 业务代码
                    userMapper.deleteById(200106);
                    int i = 10/0;
                } catch (Exception e) {
                    transactionStatus.setRollbackOnly();
                }
            }
        });
    }

使用PlatformTransactionManager进行编程式事务管理

    @Autowired
    PlatformTransactionManager platformTransactionManager;
    public void doTest() {
        TransactionStatus transaction = platformTransactionManager.getTransaction(new DefaultTransactionDefinition());
        try{
            // 业务代码
            userMapper.deleteById(200106);
            int i = 10/0;
            platformTransactionManager.commit(transaction);
        }catch (Exception e){
            platformTransactionManager.rollback(transaction);
        }
    }

声明式事务管理

Spring主要通过两种方式实现声明式事务管理:

基于注解的声明式事务管理

基于XML的声明式事务管理

基于注解的声明式事务管理

注解的事务管理主要靠@Transactional注解来实现的。

@Transactional注解可以作用于类或方法上,作用于类上时,该类的所有public方法都具有该事物属性

@Transactional注解只应该被应用到public修饰的方法上,这是有Spring AOP的本质决定的

    @Transactional
    public void doTest() {
        userMapper.deleteById(200106);
        int i = 10/0;
    }

@Transactional注解

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Transactional {
	// 指定事务管理器
	@AliasFor("transactionManager")
	String value() default "";
	@AliasFor("value")
	String transactionManager() default "";
	// 事务的传播行为(enum)
	Propagation propagation() default Propagation.REQUIRED;
	// 事务的隔离级别(enum)
	Isolation isolation() default Isolation.DEFAULT;
	// 事务超时时间
	int timeout() default TransactionDefinition.TIMEOUT_DEFAULT;
	// 读写或只读事务,默认读写事务
	boolean readOnly() default false;
	// 导致事务回滚的异常类
	Class<? extends Throwable>[] rollbackFor() default {};
	// 导致事务回滚的异常类名
    // noRollbackForClassName = {"ArithmeticException"}
	String[] rollbackForClassName() default {};
	// 不会导致事务回滚的异常类
	Class<? extends Throwable>[] noRollbackFor() default {};
	// 不会导致事务回滚的异常类名
	String[] noRollbackForClassName() default {};
}

Spring事务管理的三个接口

Spring对事务的操作主要通过PlatformTransactionManager接口,通过这个接口,Spring为各大平台提供了对应的事务管理器,如 JDBC(org.springframework.jdbc.datasource.DataSourceTransactionManager )等。

在Spring框架中,事务管理相关的最重要的三个接口如下:

PlatformTransactionManager

public interface PlatformTransactionManager extends TransactionManager {
    // 根据指定的传播行为,该方法返回当前活动事务或创建一个新的事务
	TransactionStatus getTransaction(@Nullable TransactionDefinition definition)
			throws TransactionException;
    // 提交指定的事务和关于它的状态
	void commit(TransactionStatus status) throws TransactionException;
	// 回滚事务
	void rollback(TransactionStatus status) throws TransactionException;
}

TransactionDefinition

public interface TransactionDefinition {
    // …………
    // 返回传播行为
	default int getPropagationBehavior() {
		return PROPAGATION_REQUIRED;
	}
    // 返回该事务隔离级别
	default int getIsolationLevel() {
		return ISOLATION_DEFAULT;
	}
    // 返回超时时间
	default int getTimeout() {
		return TIMEOUT_DEFAULT;
	}
    // 返回是否只读
	default boolean isReadOnly() {
		return false;
	}
    // 返回事务名称
	@Nullable
	default String getName() {
		return null;
	}
	static TransactionDefinition withDefaults() {
		return StaticTransactionDefinition.INSTANCE;
	}
}

TransactionStatus

public interface TransactionStatus extends TransactionExecution, SavepointManager, Flushable {
	boolean hasSavepoint();
	@Override
	void flush();
}

Spring事务属性

Spring事务管理的五大属性:隔离级别、传播行为、超时时间、是否只读、回滚规则

TransactionDefinition接口中定义了事务的隔离级别、传播行为、超时时间的常量

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;
    // ~,则创建一个事务作为当前事务的嵌套事务来运行,~,则等价于PROPAGATION_REQUIRED
	int PROPAGATION_NESTED = 6;
    // 默认的隔离级别
	int ISOLATION_DEFAULT = -1;
    // 读未提交
	int ISOLATION_READ_UNCOMMITTED = 1;
    // 读已提交
	int ISOLATION_READ_COMMITTED = 2;
    // 可重复读
	int ISOLATION_REPEATABLE_READ = 4;
    // 序列化读
	int ISOLATION_SERIALIZABLE = 8;
    // 默认的超时时间,单位:秒
    // 所谓事务超时,就是规定一个事务允许执行的最长时间,如果超过了该时间事务还没有执行完成,则回滚事务。
	int TIMEOUT_DEFAULT = -1;
	default int getPropagationBehavior() {
		return PROPAGATION_REQUIRED;
	}
	default int getIsolationLevel() {
		return ISOLATION_DEFAULT;
	}
	default int getTimeout() {
		return TIMEOUT_DEFAULT;
	}
	default boolean isReadOnly() {
		return false;
	}
	@Nullable
	default String getName() {
		return null;
	}
	static TransactionDefinition withDefaults() {
		return StaticTransactionDefinition.INSTANCE;
	}
}

是否只读:指该事物是只读操作还是读写操作,boolean类型

回滚规则:我们可以人为的控制事务在执行过程中抛出某些异常时仍然提交事务,或者抛出某些异常时回滚事务

到此这篇关于Spring超详细讲解事务的文章就介绍到这了,更多相关Spring事务内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Spring超详细讲解事务和事务传播机制

    目录 为什么需要事务 Spring 声明事务 Transactional参数说明 propagation isolation timeout 事务回滚失效解决方案 @Transactional工作原理 Spring 事务的传播机制 为什么需要事务传播机制? 传播机制的类型 为什么需要事务 事务是将一组操作封装成一个执行单元,要么全部成功,要么全部失败.如果没有事务,转账操作就会出现异常,因此需要保证原子性. Spring 声明事务 只需要在方法上添加@Transactional注解就可以实现,无

  • 老生常谈spring的事务传播机制

    目录 spring的事务传播机制 1.why 为什么会有事务传播机制? 2.传播机制生效的条件 解决方案 3.传播机制类型 PROPAGATION_REQUIRED (默认) REQUIRES_NEW (一般用在子方法需要单独事务) NESTED SUPPORTS NOT_SUPPORTED MANDATORY NEVER spring的事务传播机制 背景:实习期间几次遇到事务方法,有一次本地测试时发现事务没有回滚,就把简单描述写在wx上,今天来给spring事务做个自我总结. 1.why 为什

  • Spring数据库事务的实现机制讲解

    目录 事务控制的核心--Connection 用AOP技术保持当前的Connection Service层和Dao层共享Connection 事务为什么要切在Service层的理由 spring事务与数据库事务的区别 事务控制的核心--Connection 在开始之前,先让我们回忆一下数据库较原始的JDBC是怎么管理事务的: //仅做演示,代码不完整,不完全规范 try { con.setAutoCommit(false); statement1 = con.prepareStatement(s

  • 浅谈SpringBoot之事务处理机制

    一.Spring的事务机制 所有的数据访问技术都有事务处理机制,这些技术提供了API用来开启事务.提交事务来完成数据操作,或者在发生错误的时候回滚数据. 而Spring的事务机制是用统一的机制来处理不同数据访问技术的事务处理.Spring的事务机制提供了一个PlatformTransactionManager接口,不同的数据访问技术的事务使用不同的接口实现: 在程序中定义事务管理器的代码如下: @Bean public PlatformTransactionManager transaction

  • spring事务隔离级别、传播机制以及简单配置方式

    一.spring支持的事务声明方式 1. 编程式事务 当系统需要明确的,细粒度的控制各个事务的边界,应选择编程式事务. 2. 声明式事务 当系统对于事务的控制粒度较粗时,应该选择申明式事务,通过<tx>标签和<aop>切面形式在xml中进行配置. 3. 无论你选择上述何种事务方式去实现事务控制,spring都提供基于门面设计模式的事务管理器供选择,如下是spring事务中支持的事务管理器 事务管理器实现(org.springframework.*) 使用时机 jdbc.dataso

  • Spring的事务机制实例代码

    本文研究的主要是Spring的事务机制的相关内容,具体如下. JAVA EE传统事务机制 通常有两种事务策略:全局事务和局部事务.全局事务可以跨多个事务性资源(即数据源,典型的是数据库和消息队列),通常都需要J2EE应用服务器的管理,其底层需要服务器的JTA支持.而局部事务则与底层采用的持久化技术有关,如果底层直接使用JDBC,需要用Connection对象来操事务.如果采用Hibernate持久化技术,则需要使用session对象来操作事务. 通常的,使用JTA事务,JDBC事务及Hibern

  • Spring超详细讲解事务

    目录 什么是事务 事务的四个特性(ACID) Spring对事务的支持 编程式事务管理 声明式事务管理 基于注解的声明式事务管理 Spring事务管理的三个接口 Spring事务属性 什么是事务 一个数据库事务是一个被视为一个工作单元的逻辑上的一组操作,这些操作要么全部执行,要么全部不执行. 需要注意的是,并不是所有的数据库(引擎)都支持事务,比如说MySQL的MyISAM存储引擎 事务的四个特性(ACID) 原子性:事务是一个原子性操作,一个事务由一系列操作组成,这一系列操作要么全部执行完成,

  • Spring超详细讲解IOC与解耦合

    目录 前言 一.所谓耦合 二.Spring 三.核心IOC理解 1.容器 2.控制反转 3.依赖注入 四.Bean的实例化 1.无参构造 2.工厂静态方法 3.工厂实例方法(常用) 五.Bean的依赖注入 1.set注入 2.有参构造 六.第一个Spring案例 前言 回想写过的图书管理系统.租房系统.电影院卖票系统都是基于原生的JavaSE.OOP,没有用到任何框架,在层与层的关系中一个类要想获得与其他类的联系主要的方式还是靠new,这就导致层与层之间.对象与对象之间的依赖性强“动一发而迁全身

  • SpringBoot超详细讲解事务管理

    目录 1. 事务的定义 2. 事务的特性 3. 事务的隔离性 4. 事务管理 5. 示例 1. 事务的定义 事务是由 N 步数据库操作序列组成的逻辑执行单元,这系列操作要么全部执行,要么全部放弃执行. 2. 事务的特性 事务的 ACID 特性: 原子性:事务是应用中不可分割的最小执行体 一致性:事务执行的结果必须使得数据从一个一致性状态转变为另一个一致性状态 隔离性:各个事务的执行互不干扰,任何事务的内部操作对其他事务都是隔离的 持久性:事务一旦提交,对数据所做的任何修改都要记录到永久存储器中

  • Spring超详细讲解创建BeanDefinition流程

    目录 一.前期准备 1.1 环境依赖 1.2 实体类 1.3 applicationContext.xml 1.4 测试代码 二.探究过程 2.1 目标 2.2 BeanDefinition的创建过程 2.2.1 回顾bean对象的创建 2.2.2 AbstractApplicationContext 2.2.3 AbstractXmlApplicationContext 2.2.4 AbstractBeanDefinitionReader 2.2.5 XmlBeanDefinitionRead

  • Spring超详细讲解BeanUtils改造

    目录 1.基本原理 2.使用 3.性能 4.提醒 1.基本原理 原理:https://www.jb51.net/article/252384.htm 浅拷贝:https://www.jb51.net/article/221283.htm BeanUtils.copyProperties();确实为我们做了很多事情,虽然不能完美完成深拷贝,但是对于 po.vo.dto 的拷贝已经足够用了.但是其还是有一些不够完美的地方. 不足几点如下: 不能拷贝 list,而拷贝 list 的情况又大量存在,因此

  • Spring超详细讲解面向对象到面向切面

    目录 前言 一.OOP&AOP 二.AOP核心 三.第一个AOP案例 1.环境准备 2.AOP实现步骤 四.切入点表达式 1.语法格式 2.通配符 五.AOP通知类型 环境准备 环绕通知 1.返回后通知 2.异常后通知 前言 Object object = new Object(); 世间万物的本质都可看作类的对象,面向对象(OOP)的模式让程序易维护.易复用.易扩展,而面向切面(AOP)则是面向对象的补充,让对象的功能更加强大 对比前面的日志框架技术二者非常相似,他的特点就是在不影响业务的前提

  • Spring超详细讲解注解开发

    目录 1.使用注解开发 1.1.Bean的实现 1.2.属性注入 1.3.衍生注解 1.4.自动装配注解 1.5.作用域 1.6.小结 2.基于Java类进行配置 1.使用注解开发 说明 在spring4之后,想要使用注解形式,必须得要引入aop的包 在配置文件当中,还得要引入一个context约束 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.spring

  • Spring超详细讲解AOP面向切面

    目录 简介 AOP底层原理 代理概念 JDK动态代理实现 Spring中的AOP 相关术语 AspectJ 实现AOP 不同通知类型实现 相同的切入点抽取 增强类优先级 完全使用注解开发 说明:基于atguigu学习笔记. 简介 AOP(Aspect Oriented Programming)是一种面向切面的编程思想.不同于面向对象里的继承思想,当需要为多个不具有继承关系的对象引人同一个公共行为时,也就是把程序横向看,寻找切面,插入公共行为. AOP目的是为了些把影响了多个类的公共行为抽取到一个

  • Java 超详细讲解核心类Spring JdbcTemplate

    目录 JdbcTemplate概述 JdbcTemplate开发步骤 JdbcTemplate快速入门 Spring产生JdbcTemplate对象 JdbcTemplate的常用操作 修改操作 删除和查询全部操作 查询单个数据操作 本章小结 JdbcTemplate概述 它是spring框架中提供的一个对象,是对原始繁琐的Jdbc API对象的简单封装.spring框架为我们提供了很多的操作 模板类.例如:操作关系型数据的JdbcTemplate和HibernateTemplate,操作nos

随机推荐