zoukankan      html  css  js  c++  java
  • MySQL事务之数据结构

    事务是关系型数据库的核心,贯穿整个源代码,先来瞅瞅相关的数据结构,揭开面纱:

    server层和innodb引擎层分别对应了不同的数据结构,但相互关联:

    1. server层需要引擎注册事务,以便server层能够引用。
    2. innodb层需要维持事务的状态,以及事务的状态转换的具体实现。

    1. 相关数据结构

    下面用一个简略图描述server和innodb的事务交互:

      

    简单描述一下:

      server层通过stmt和all链表关联了所有参与事务的引擎。 每一个connection,在innodb引擎分配一个trx结构,维持到会话结束。

      无论一个事务有几条语句,有多少参与的table, 一个引擎只注册一次,因为一个session当前只有一个活动事务。server通过注册的引擎,通知引擎完成事务相关的操作。

    相关的数据结构:

    THD_TRANS
    Ha_data
    Ha_trx_info
    trx_sys_struct
    trx_struct

    具体可以参考源码。

    2.  事务如何开始

      测试: select * from t   

        t表的引擎是innodb

    1. 首次连接

      第一次连接,创建THD对象时,初始ha_data[MAX_HA]数组,但并为完成引擎的初始化。

      thd->transaction.stmt/all都为空。

    2. 创建trx: 对应于每一个连接,表示连接的事务上下文

      当语句执行的时候,创建innodb的trx结构,对应ha_data[8].ha_ptr.

    函数调用栈:

      ha_innobase::store_lock

        check_trx_exists
          innobase_trx_allocate
            trx_allocate_for_mysql:
              1. trx_create: 创建trx结构
              2. 递增trx_n_mysql_transactions全局计数
              3. 加入全局链表trx_sys->mysql_trx_list
            innobase_trx_init

              初始化 trx跟当前server 层thd关联

    注:执行语句的过程中,轮询语句的所有table,在get_table_lock的过程分配trx,因为事务和锁是相关的。所有事务相关的注册等都和table_lock的过程紧密在一起。

    3. 注册参与事务的引擎到thd->transaction

       ha_info->is_started()如果ha_info已经和引擎关联,那么说明这个事务已经开始,注册过了。

      这里要分两种情况:

      1. 如果autocommit=0

        innodb引擎需要注册stmt,all两个链表

      2. 如果autocommit=1

        innodb引擎只需要注册stmt链表即可

    注册后的结果是:

    (gdb) p thd->transaction.all.ha_list.m_ht.db_type
    $66 = DB_TYPE_INNODB

    4. 事务提交

      如果autocommit=0 ,在事务提交时:

      释放锁:

        ha_innobase::external_lock

          trx->n_mysql_tables_in_use--; 释放table lock的过程中,清理trx结构

      提交:

        trans_commit_stmt
          if(thd->transaction.stmt.ha_list)
            ha_commit_trans(thd, FALSE);

            thd->transaction.stmt.reset();  重置stmt链表
            commit_one_phase_low;    重置ha_trx_info为没有使用状态。

    这里仅仅是事务的开始,未完待续......

  • 相关阅读:
    IP 封包中的 Header 的 Protocol 字段的 值
    二叉树算法题
    PageFile Swap File
    Quick sort C# code(2)
    VS中Sos调试扩展简介 (转帖)
    BUG: "Old format or invalid type library" error when automating Excel on 64 bit server 2008
    Sql server 2005 connection string
    让IE支持自己的协议
    偶然间,我发现了一个秘密能使盗版的windowsXP变成正版
    Excel C# Automation
  • 原文地址:https://www.cnblogs.com/xpchild/p/3821371.html
Copyright © 2011-2022 走看看