• Spring 事务(Transaction)的简介说明


    转自:

    Spring 事务(Transaction)的简介说明

    事务的简介说明

    事务(Transaction)是面向关系型数据库(RDBMS)中重要的部分,它用于保证数据库中数据的完整性和一致性
    事务具有以下 4 个特性,即原子性、一致性、隔离性和持久性,这 4 个属性称为 ACID 特性

    事务特性备注说明
    原子性(Atomicity)一个事务是一个不可分割的工作单位,事务中包括的动作要么都做要么都不做
    一致性(Consistency)事务必须保证数据库从一个一致性状态变到另一个一致性状态,一致性和原子性是密切相关的
    隔离性(Isolation)一个事务的执行不能被其它事务干扰,即一个事务内部的操作及使用的数据对并发的其它事务是隔离的, 并发执行的各个事务之间不能互相打扰
    持久性(Durability)持久性也称为永久性,指一个事务一旦提交,它对数据库中数据的改变就是永久性的, 后面的其它操作和故障都不应该对其有任何影响

    Spring事务的实现方式

    方式一:编程式 方式二:声明式

    1. 编程式事务管理

    编程式事务管理:采用编写代码的方式进行事务管理,可以方便代码维护

    2. 声明式事务管理

    Spring 声明式事务管理:
    在底层采用了AOP 技术,
    其最大优点无需编码,只需配置即可实现事务管理

    Spring实现声明式事务管理有以下2种方式

    1.使用XML方式的声明式事务管理
    2.使用Annotation注解方式进行事务管理
    事务管理接口
    PlatformTransactionManager、TransactionDefinition 和 TransactionStatus 是事务的 3 个核心接口
    PlatformTransactionManager接口
    PlatformTransactionManager 接口用于管理事务,接口定义如下

    public interface PlatformTransactionManager {
        TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException;
        void commit(TransactionStatus status) throws TransactionException;
        void rollback(TransactionStatus status) throws TransactionException;
    }
    

    该接口中方法说明如下 在项目中,Spring 将 xml 中配置的事务信息封装到对象 TransactionDefinition 中, 然后通过事务管理器的 getTransaction() 方法获得事务的状态(TransactionStatus),并对事务进行下一步的操作

    名称说明
    TransactionStatus getTransaction(TransactionDefinition definition)用于获取事务的状态信息
    void commit(TransactionStatus status)用于提交事务
    void rollback(TransactionStatus status)用于回滚事务

    TransactionDefinition接口
    TransactionDefinition 接口提供了获取事务相关信息的方法,接口定义如下

    public interface TransactionDefinition {
        int getPropagationBehavior();
        int getIsolationLevel();
        String getName();
        int getTimeout();
        boolean isReadOnly();
    }
    

    该接口中方法说明如下

    方法说明
    String getName()获取事务的名称
    int getIsolationLevel()获取事务的隔离级别
    int getPropagationBehavior()获取事务的传播行为
    int getTimeout()获取事务的超时时间
    boolean isReadOnly()获取事务是否只读以下是隔离级别的值
    方法说明
    ISOLATION_DEFAULT使用后端数据库默认的隔离级别
    ISOLATION_READ_UNCOMMITTED允许读取尚未提交的更改,可能导致脏读、幻读和不可重复读
    ISOLATION_READ_COMMITTED(Oracle 默认级别)允许读取已提交的并发事务,防止脏读,可能出现幻读和不可重复读
    ISOLATION_REPEATABLE_READ(MySQL 默认级别),多次读取相同字段的结果是一致的,防止脏读和不可重复读,可能出现幻读
    ISOLATION_SERIALIZABLE完全服从 ACID 的隔离级别,防止脏读、不可重复读和幻读

    关于事务隔离级别,详细介绍推荐阅读《数据库事务隔离级别》一节
    以下是传播行为的可能值,传播行为用来控制是否需要创建事务以及如何创建事务

    名称说明
    PROPAGATION_MANDATORY支持当前事务,如果不存在当前事务,则引发异常
    PROPAGATION_NESTED如果当前事务存在,则在嵌套事务中执行
    PROPAGATION_NEVER不支持当前事务,如果当前事务存在,则引发异常
    PROPAGATION_NOT_SUPPORTED不支持当前事务,始终以非事务方式执行
    PROPAGATION_REQUIRED默认传播行为,支持当前事务,如果不存在,则创建一个新的
    PROPAGATION_REQUIRES_NEW创建新事务,如果已经存在事务则暂停当前事务
    PROPAGATION_SUPPORTS支持当前事务,如果不存在事务,则以非事务方式执行

    TransactionStatus接口
    TransactionStatus 接口提供了一些简单的方法来控制事务的执行和查询事务的状态,接口定义如下

    public interface TransactionStatus extends SavepointManager {
        boolean isNewTransaction();
        boolean hasSavepoint();
        void setRollbackOnly();
        boolean isRollbackOnly();
        boolean isCompleted();
    }
    

    该接口中方法说明如下

    名称说明
    boolean hasSavepoint()获取是否存在保存点
    boolean isCompleted()获取事务是否完成
    boolean isNewTransaction()获取是否是新事务
    boolean isRollbackOnly()获取事务是否回滚
    void setRollbackOnly()设置事务回滚
  • 相关阅读:
    一条 SQL 更新语句如何执行的
    ubuntu(20.04)-安装JAVA环境-IDEA
    Mysql数据库常用命令,终端命令,cmd
    基于java+springboot+mybatis+vue+elementui的农产品销售商城网站
    系统与应用监控的缜密思路
    Docker安装ActiveMQ
    2022软考高项十大领域知识整理(四)-人力资源管理、干系人管理、采购管理
    快35了,还在“点点点”?那些入行几年的测试点工后来都怎么样了?
    Java框架 Spring5--IOC
    webpack:详解代码分离以及插件SplitChunksPlugin的使用
  • 原文地址:https://blog.csdn.net/qq_25073223/article/details/127682195