首页 > 编程语言 > 详细

Spring 事务传播属性

时间:2021-03-16 17:23:36      阅读:31      评论:0      收藏:0      [点我收藏+]

Spring 事务相关

3 个 API 定义类

Spring 事务底层 API 定义主要有 PlatformTransactionManagerTransactionDefintionTransactionStatus

  • 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、私有方法也不会被代理

Spring 事务传播属性

原文:https://www.cnblogs.com/fvames/p/13750941.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!