美文网首页
Spring特性介绍-事务机制

Spring特性介绍-事务机制

作者: 洛神灬殇 | 来源:发表于2022-02-17 22:40 被阅读0次

    概念介绍

     1、事务:事务是指逻辑上一组操作,这组操作要么全部成功,要么全部失败。
    
     2、事务特性:ACID(原子性、一致性、隔离性、持久性)
    
          (1)原子性:不可分割的逻辑单元,事务中操作要么发生,要么不发生;
    
          (2) 一致性:事务前后数据的完整性必须保持一致;
    
          (3)隔离性:用户并发访问数据库时,多个事务之间相互独立,互不影响;
    
          (4)持久性:一个事务一旦提交,它对数据库中的改变就是永久性的。
    

    三、事务管理的API介绍

    Spring事务管理器高层抽象主要有三个接口:
    
    1、PlatformTransactionManager事务管理器
    
          (1)Spring为不同的持久化框架提供了不同的PlatformTransactionManager接口实现
    
               【1】使用Spring JDBC或MyBatis进行持久化数据时使用          
    
                 org.springframework.jdbc.datasource.DataSourceTransactionManager 
    
               【2】使用Hibernate3.0版本进行持久化数据时使用
    
                 org.springframework.orm.hibernate3.HibernateTransactionManager
    
               【3】使用JPA进行持久化数据时使用
    
                 org.springframework.orm.jpa.JpaTransactionManager
    
               【4】使用JDO进行持久化数据时使用
    
                 org.springframework.orm.jdo.JdoTransactionManager
    
               【5】使用一个JTA实现来管理事务,在一个事务跨越多个数据库时必须使用
    
                 org.springframework.transaction.jta.JtaTransactionManager
    
           (2)PlatformTransactionManager源码
    

    public abstract interface PlatformTransactionManager

    {

    public abstract TransactionStatus getTransaction(TransactionDefinition paramTransactionDefinition)

    throws TransactionException;

    public abstract void commit(TransactionStatus paramTransactionStatus)

    throws TransactionException;

    public abstract void rollback(TransactionStatus paramTransactionStatus)

    throws TransactionException;

    }

    (2)TransactionDefinition事务定义信息(隔离、传播、超时、只读)

          TransactionDefinition源码:
    

    public abstract interface TransactionDefinition{

    // 事务传播行为:如果存在当前事务,则加入到当前事务中,否则新增一个事务

    public static final int PROPAGATION_REQUIRED = 0;

    // 事务传播行为:如果存在当前事务,则加入到当前事务中,否则以非事务方式执行

    public static final int PROPAGATION_SUPPORTS = 1;

    // 事务传播行为:如果存在当前事务,则加入到当前事务中,否则抛出异常

    public static final int PROPAGATION_MANDATORY = 2;

    // 事务传播行为:如果存在当前事务,则把当前事务挂起,新建一个新的事务

    public static final int PROPAGATION_REQUIRES_NEW = 3;

    // 事务传播行为:以非事务方式执行,如果存在当前事务,则挂起当前事务

    public static final int PROPAGATION_NOT_SUPPORTED = 4;

    // 事务传播行为:以非事务方式执行,如果存在当前事务,则抛出异常

    public static final int PROPAGATION_NEVER = 5;

    // 事务传播行为:如果存在当前事务,则嵌套执行事务。否则按TransactionDefinition.PROPAGATION_REQUIRED属性执行

    public static final int PROPAGATION_NESTED = 6;

    // 事务隔离性:默认数据库隔离级别(mysql:REPEATABLE_READ;oracle:READ_COMMITTED)

    public static final int ISOLATION_DEFAULT = -1;

    // 事务隔离性:读未提交,会产生脏读、重复读、幻读(场景:查询)

    public static final int ISOLATION_READ_UNCOMMITTED = 1;

    // 事务隔离性:读提交,会产生重复读、幻读(场景:修改)

    public static final int ISOLATION_READ_COMMITTED = 2;

    // 事务隔离性:重复读,会产生幻读(场景:插入)

    public static final int ISOLATION_REPEATABLE_READ = 4;

    // 事务隔离性:序列化,避免了脏读、重复读、幻读,事务按顺序执行,消耗资源,性能低

    public static final int ISOLATION_SERIALIZABLE = 8;

    // 事务超时时间设置,默认超时时间设置不生效

    public static final int TIMEOUT_DEFAULT = -1;

    // 获取事务传播行为

    public abstract int getPropagationBehavior();

    // 获取事务隔离级别

    public abstract int getIsolationLevel();

    // 获取事务超时时间设置

    public abstract int getTimeout();

    // 获取事务是否是只读状态

    public abstract boolean isReadOnly();

    // 获取事务名称

    public abstract String getName();

    }

    (3)TransactionStatus事务具体运行状态
    
          TransactionStatus源码:
    

    public abstract interface TransactionStatus

    extends SavepointManager, Flushable

    {

    // 事务状态:是否是一个新事务

    public abstract boolean isNewTransaction();

    // 事务状态: 返回这个事务是否在内部携带一个保存点, 也就是说,已经创建为基于保存点的嵌套事务。

    public abstract boolean hasSavepoint();

    // 事务状态:设置只回滚

    public abstract void setRollbackOnly();

    // 事务状态:是否设置只回滚状态

    public abstract boolean isRollbackOnly();

    // 事务状态:将底层会话刷新到数据存储(如果适用):例如,所有受影响的Hibernate / JPA会话。

    public abstract void flush();

    // 事务状态:是否完成了事务

    public abstract boolean isCompleted();

    }

    四、事务总结

    Spring将事务分成两类:

    (1)编程式事务
    
          TransactionTemplate事务模板
    
          手动编写事务代码,代码侵入性强(很少使用)
    
    (2)声明式事务
    
          【1】基于TransactionProxyFactoryBean方式
    
                   需要为每个进行事务管理的类,配置一个TransactionProxyFactoryBean代理或者增强
    
          【2】基于AspectJ的XML方式
    
                   一旦配置好之后,类上不需要添加任何东西
    
          【3】基于@Transactional注解方式
    
                   配置简单,需要在业务类上配置@Transactional注解
    

    相关文章

      网友评论

          本文标题:Spring特性介绍-事务机制

          本文链接:https://www.haomeiwen.com/subject/nmhelrtx.html