`

Transaction源码

 
阅读更多

Transaction模块用于实现,某构造函数的实例调用perform(method,args)方法时,在method函数执行前后调用特定钩子函数的功能。成对的前置钩子initialize函数和后置钩子close函数以数组形式添加,且前置钩子initialize函数用于向后置钩子close函数提供参数,在method函数前调用;后置钩子close在method函数后调用。

构造函数需原型继承Transaction,或原型方法逐个赋值。且getTransactionWrappers方法用于添加前置钩子与后置钩子;reinitializeTransaction方法在初始化时调用,用于清空前、后置钩子;perform方法实际执行method函数、及前后钩子。

 

'use strict';

var _prodInvariant = require('./reactProdInvariant');// 生产环境React形式带url报错

// invariant(condition,format,a,b,c,d,e,f) condition为否值,替换format中的"%s",并throw error报错
var invariant = require('fbjs/lib/invariant');

var OBSERVED_ERROR = {};

// 用于在某函数method执行前后,添加前置钩子initialize和后置钩子close,前置钩子的意义是向后置钩子提供参数
// 通过原型继承或原型方法赋值,将reinitializeTransaction、getTransactionWrappers、perform方法赋值给某构造函数的实例
// reinitializeTransaction方法在该实例初始化时执行
// getTransactionWrappers方法用于添加前、后置钩子,返回值为[{initialize:function(){},close:function(){}}]形式
// perform(method,args)方法触发前置钩子initialize、method(args)、后置钩子close的顺序执行
var TransactionImpl = {
  // 初始化
  reinitializeTransaction: function () {
    // 将前置钩子和后置钩子transactionWrapper添加到this.transactionWrappers中
    this.transactionWrappers = this.getTransactionWrappers();

    // 初始化后置钩子close方法的参数,由前置钩子initialize方法返回值构成
    if (this.wrapperInitData) {
      this.wrapperInitData.length = 0;
    } else {
      this.wrapperInitData = [];
    }

    this._isInTransaction = false;
  },

  _isInTransaction: false,

  // 用于添加method方法的前置钩子及后置钩子transactionWrapper={initialize:function(){},close:function(){}}
  // 前置钩子initialize方法为后置钩子close方法提供参数,且存放于this.wrapperInitData中
  // 返回值形如[{initialize:function(){},close:function(){}}]
  getTransactionWrappers: null,

  // 判断perform方法执行与否,由此断点closeAll方法是外部调用还是内部调用(不允许外部调用)
  isInTransaction: function () {
    return !!this._isInTransaction;
  },

  // 外部接口,执行各前置钩子initialize方法,随后执行method函数,最后执行后置钩子close方法
  perform: function (method, scope, a, b, c, d, e, f) {
    // 实例的perform方法单次只能执行一个
    !!this.isInTransaction() ? 
      process.env.NODE_ENV !== 'production' ? 
        invariant(false, 'Transaction.perform(...): ' 
          + 'Cannot initialize a transaction when there is already an outstanding transaction.') 
        : _prodInvariant('27') : void 0;

    var errorThrown;
    var ret;
    try {
      this._isInTransaction = true;// perform方法执行中标志
      errorThrown = true;
      this.initializeAll(0);
      ret = method.call(scope, a, b, c, d, e, f);
      errorThrown = false;
    } finally {
      try {
        if (errorThrown) {
          // method函数报错,捕获后置钩子的报错
          try {
            this.closeAll(0);
          } catch (err) {}
        } else {
          // method函数不报错,后置钩子正常报错
          this.closeAll(0);
        }
      } finally {
        this._isInTransaction = false;
      }
    }
    return ret;
  },

  // 内部调用,在method函数执行前,调用前置钩子transactionWrapper中的initialize方法
  initializeAll: function (startIndex) {
    var transactionWrappers = this.transactionWrappers;
    for (var i = startIndex; i < transactionWrappers.length; i++) {
      var wrapper = transactionWrappers[i];
      try {
        this.wrapperInitData[i] = OBSERVED_ERROR;
        this.wrapperInitData[i] = wrapper.initialize ? wrapper.initialize.call(this) : null;
      } finally {
        // 报错即行跳过
        if (this.wrapperInitData[i] === OBSERVED_ERROR) {
          try {
            this.initializeAll(i + 1);
          } catch (err) {}
        }
      }
    }
  },

  // 内部调用,在method函数执行后,调用后置钩子transactionWrapper中的initialize方法
  closeAll: function (startIndex) {
    // 外部直接调用时报错,须由perform方法调用执行
    !this.isInTransaction() ? 
      process.env.NODE_ENV !== 'production' ? 
        invariant(false, 'Transaction.closeAll(): Cannot close transaction when none are open.') 
        : _prodInvariant('28') : void 0;

    var transactionWrappers = this.transactionWrappers;
    for (var i = startIndex; i < transactionWrappers.length; i++) {
      var wrapper = transactionWrappers[i];
      var initData = this.wrapperInitData[i];// 前置钩子返回值
      var errorThrown;
      try {
        errorThrown = true;
        if (initData !== OBSERVED_ERROR && wrapper.close) {
          wrapper.close.call(this, initData);
        }
        errorThrown = false;
      } finally {
        // 报错即行跳过
        if (errorThrown) {
          try {
            this.closeAll(i + 1);
          } catch (e) {}
        }
      }
    }

    // 清空提供给后置钩子close方法的参数
    this.wrapperInitData.length = 0;
  }
};

module.exports = TransactionImpl;

 

 

分享到:
评论

相关推荐

    python django事务transaction源码分析详解

    本文将深入解析`transaction.atomic`的源码,帮助理解其工作原理。 首先,`transaction.atomic`有两种主要的使用方式:作为装饰器和作为上下文管理器。这两种方式都是为了确保在指定的代码块中执行的所有数据库操作...

    Hibernate+Transaction+myeclipse6+事例+工程源码.rar

    本篇将围绕"Hibernate+Transaction+myeclipse6"这一主题,结合具体的工程源码实例,探讨它们在实际项目中的应用。 首先,我们来理解Hibernate的核心概念。Hibernate是一个基于Java的ORM框架,它允许开发者以面向...

    Transaction

    chart_3 一个新的Flutter应用程序。 入门 该项目是Flutter应用程序的起点。 如果这是您的第一个Flutter项目,那么有一些资源可以帮助您入门: 要获得Flutter入门方面的帮助,请查看我们的,其中提供了教程,示例,...

    com.qz.transaction.MainActivity 非常好的源码资源

    `com.qz.transaction`这个包名暗示了该应用可能专注于交易或财务相关的功能,`MainActivity`作为应用的起点,其源码将展示如何初始化应用、创建用户界面、处理交易数据以及与其他组件交互等关键步骤。 【标签】...

    HibernateSession , Transaction 研究

    通过源码分析,我们可以更深入地理解`Session`和`Transaction`的实现细节。`Session`的内部维护了一个JDBC的`Connection`对象,而`Transaction`则管理着`Connection`上的事务状态。`SessionFactory`是`Session`的...

    分布式事务书籍随书源码-distribute-transaction.zip

    "distribute-transaction.zip"这个压缩包包含了"分布式事务书籍随书源码-distribute-transaction",很可能是为了辅助读者理解和学习分布式事务设计与实现而提供的。 首先,分布式事务的基本概念是:在分布式系统中...

    bitcoin源码分析文档

    Bitcoin 源码分析文档 本文档对 Bitcoin 源码进行了深入分析,涵盖了 Bitcoin 源码中各个模块的关联关系图、各个模块类关系图等。下面是对 Bitcoin 源码分析文档中所涉及的知识点的详细说明: 术语介绍 在 ...

    jotm2.0最新源码包

    JOTM,全称为Java Open Transaction Manager,是一个开源的、完全符合JTA(Java Transaction API)规范的事务管理器。JTA是Java平台上的标准接口,用于管理分布式事务处理,确保在多线程和分布式环境中的数据一致性...

    There is no active transaction解决

    之前一直找原因,最后知道了解决方法,具体请下载源码查看。特别是用到throw的事务中

    java 网上支付源码

    例如,使用JTA(Java Transaction API)进行分布式事务管理。 5. **异常处理与错误报告**:良好的异常处理和错误报告机制可以及时发现并解决支付过程中的问题。Java源码应包含对网络异常、支付失败、服务器错误等的...

    spring源码中英文注释

    4. **事务管理(Transaction Management)**:Spring提供了声明式和编程式的事务管理。在源码中,`PlatformTransactionManager`和`@Transactional`注解是核心概念,前者定义了事务管理的策略,后者则在方法级别声明...

    源码\Android程序源码--数据库

    源码中可能有`beginTransaction()`, `setTransactionSuccessful()`, `endTransaction()`等方法来控制事务。 通过深入学习和分析这个Android程序源码,开发者不仅可以掌握SQLite的基本操作,还能了解到Android数据...

    seata-2.x 源码包

    在源码中,TM 的接口定义在 `io.seata.core.protocol.transaction` 包下,理解 TM 如何与 TC 交互对掌握 Seata 工作原理至关重要。 5. **资源代理(RM, Resource Manager)**: RM 代表数据库或者其他存储资源,它...

    Java聚合支付源码

    5. **异常处理与事务管理**:在处理支付过程中,可能会遇到网络问题、服务器错误等情况,因此源码中会包含完善的异常处理机制,以及使用Spring的Transaction API进行事务管理,保证数据一致性。 6. **测试与调试**...

    hibernate 源码直接导入Eclipse

    接下来,我们将深入探讨Hibernate的核心概念、如何在Eclipse中导入源码以及如何利用这些源码进行学习。 1. Hibernate 核心概念: - ORM(Object-Relational Mapping):ORM是将数据库中的关系数据映射为Java对象的...

    tomcat源码导入myeclipse

    5. jta-1.1.jar: Java Transaction API,提供了分布式事务处理的能力,对于在多资源间协调事务操作的Web应用来说非常重要。 导入Tomcat源码到MyEclipse的步骤通常包括以下几个阶段: 1. **准备环境**:确保已安装...

    Spring中的@Transactional事物回滚实例源码

    在`first_maven_project`中,我们可以通过查看源码,了解如何在实际应用中使用这个注解来处理事务,以及遇到异常时如何触发事务回滚。这有助于理解Spring事务管理机制的运作方式,从而提升开发和维护效率。

Global site tag (gtag.js) - Google Analytics