Spring中的事务控制

时间:2019-11-06
本文章向大家介绍Spring中的事务控制,主要包括Spring中的事务控制使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

1 Spring事务控制我们要明确的

  • ①JavaEE体系进行分层开发,事务处理位于业务层,Spring提供了分层设计业务层的事务处理解决方案。
  • ②Spring框架为我们提供了一组事务控制的接口。这组接口在spring-tx-5.0.2.RELEASE.jar中。
  • ③Spring的事务控制都是基于AOP的,它既可以使用编程的方式实现,也可以使用配置的方式实现。

2 Spring中事务控制的API的介绍

2.1 PlatformTransactionManager

  • 此接口是Spring的事务控制器,它里面提供了我们常用的操作事务的方法,如下所示:
package org.springframework.transaction;

import org.springframework.lang.Nullable;

public interface PlatformTransactionManager extends TransactionManager {
        /**
    * 获取事务状态信息
        */        
    TransactionStatus getTransaction(@Nullable TransactionDefinition definition)
            throws TransactionException;

    /**
    * 提交事务
        */
    void commit(TransactionStatus status) throws TransactionException;

           /**
    * 回滚事务
        */
    void rollback(TransactionStatus status) throws TransactionException;

}
  • 我们开发中都是使用它的实现类,如下图所示:

2.2 TransactionDefinition

  • 它是事务的定义信息对象,里面有如下的方法:
package org.springframework.transaction;

import org.springframework.lang.Nullable;

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 = 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;
    }

}

2.2.1 事务的隔离级别

  • 事务的隔离级别反映事务提交并发访问时的处理态度。
  • ISOLATION_DEFAULT:默认级别。使用时底层数据库的事务隔离级别。
  • ISOLATION_READ_UNCOMMITTED:读未提交。
  • ISOLATION_READ_COMMITTED:读已提交。解决了脏读问题。
  • ISOLATION_REPEATABLE_READ:可重复读。解决了脏读、不可重复读问题。
  • ISOLATION_SERIALIZABLE :序列化。解决了脏读、不可重复读和幻读的问题。

2.2.2 事务的传播行为

  • PROPAGATION_REQUIRED:如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。一般选择这个(默认值)。
  • PROPAGATION_SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行(没有事务)。
  • PROPAGATION_MANDATORY :使用当前的事务,如果当前没有事务,就抛出异常。
  • PROPAGATION_REQUIRES_NEW:新建事务,如果当前在事务中,把当前事务挂起。
  • PROPAGATION_NOT_SUPPORTED :以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
  • PROPAGATION_NEVER :以非事务方式运行,如果当前存在事务,抛出异常。
  • PROPAGATION_NESTED :如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行REQUIRED类似的操作。

2.2.3 超时时间

  • 默认值是-1,表示没有时间限制。如果有,以秒为单位进行设置。

2.2.4 是否是只读事务

  • 建议查询时设置为只读。

2.3 TransactionStatus

  • 此接口提供的是事务具体的运行装填,方法如下:
package org.springframework.transaction;

import java.io.Flushable;

public interface TransactionStatus extends TransactionExecution, SavepointManager, Flushable {

    /**
     * 是否含有保存点
     */
    boolean hasSavepoint();

    /**
     * 刷新事务
     */
    @Override
    void flush();

        /**
     * 是否是新事务 
      */
    boolean isNewTransaction();

    /**
     * 设置事务回滚
     */
    void setRollbackOnly();

    /**
     * 是否回滚
     */
    boolean isRollbackOnly();

    /**
     * 事务是否完成
     */
    boolean isCompleted();

}

3 基于XML声明式事务控制

 

原文地址:https://www.cnblogs.com/xuweiweiwoaini/p/11808873.html