注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

网易杭研后台技术中心的博客

 
 
 
 
 

日志

 
 

线程,事务与存储引擎的关系  

来自raolh   2013-05-09 11:45:15|  分类: MySQL |举报 |字号 订阅

  下载LOFTER 我的照片书  |

2013-05-09 11:43:55|  分类: 默认分类|字号 订阅


在MySQL中一个事务可以使用多个存储引擎,一个事务只能运行在一个线程中。在MySQL上层代码中他们是怎么联系起来的呢?
首先讲讲存储引擎的上层接口数据结构,任何引擎在MySQL上层代码中都有一个共同的接口,该数据结构定义在文件Handler.h中,结构如下:

struct handlerton
{
  enum legacy_db_type db_type;
  uint slot;
  uint savepoint_offset
  。。。
  int  (*commit)(handlerton *hton, THD *thd, bool all);
  void (*commit_checkpoint_request)(handlerton *hton, void *cookie);
   int  (*rollback)(handlerton *hton, THD *thd, bool all);
   int  (*prepare)(handlerton *hton, THD *thd, bool all);
   int  (*recover)(handlerton *hton, XID *xid_list, uint len);
   int  (*commit_by_xid)(handlerton *hton, XID *xid);
  。。。
}

handlerton中保存的信息大部分是指向引擎内部函数的指针,也有几个是供上层使用的。比如:db_type是引擎的类型,binlog的类型是:DB_TYPE_BINLOG,innoDB的类型是:DB_TYPE_INNODB 。
着重介绍slot,它和本篇的主题相关。每一个存储引擎在线程中都有一块独立的存储区域,用于存储一次连接的信息。该存储区域被安排在线程结构THD的数组ha_data[...]中,slot是本引擎的存储区域在线程空间数组中的位置。通过slot的值可以找到引擎在线程中的区域位置:thd->ha_data[xxx_hton->slot]。
然后介绍线程结构THD,MySQL中运行的每一个客户端连接线程都有一个THD结构,用于保存线程和连接的信息。THD的结构定义在文件sql_class.h中,大体结构是:

class THD :public Statement,  public Open_tables_state
{
。。。
 Ha_data ha_data[MAX_HA];
transaction
  。。。
}

THD的成员非常之多,只介绍和本篇相关的两个成员变量。ha_data[]前面介绍过是用来保存各个存储引擎的连接信息,transaction用来保存线程中正在运行的事务信息。
Ha_data的结构定义在sql_class.h文件中,定义如下:

struct Ha_data
{
  void *ha_ptr;
  Ha_trx_info ha_info[2];
  plugin_ref lock;
};

其中,ha_ptr指向的是和引擎相关的数据储存结构,比如binlog是binlog_cache_mngr结构, binlog的内存缓冲区域。
数组ha_info[2]中,ha_info[0]保存的是一条语句的引擎信息,ha_info[1]保存的是一个事务的引擎信息。该成员会被加入到transcation的all或者stmt链表中。
Ha_trx_info的结构如下:

struct Ha_trx_info
{
  Ha_trx_info *m_next;
  handlerton *m_ht;
  uchar       m_flags;
};

最后介绍事务transcation的数据结构,定义在文件sql_class.h中,结构如下:

struct st_transactions {
    SAVEPOINT *savepoints;
    THD_TRANS all; // Trans since BEGIN WORK
    THD_TRANS stmt; // Trans for current statement
    bool on;                            // see ha_enable_transaction()
    XID_STATE xid_state;
    Rows_log_event *m_pending_rows_event;
   。。。
}

和本篇相关的成员变量是all和stmt,all中保存的是所有支持事务的引擎结构,stmt中保存的是不支持事务的引擎结构。
THD_TRANS的结构定义是:

struct THD_TRANS
{
  /* true is not all entries in the ht[] support 2pc */
  bool        no_2pc;
  /* storage engines that registered in this transaction */
  Ha_trx_info *ha_list;
。。。
}

所以线程,事务,存储引擎三者的数据结构联系可以用下图来表示:
线程,事务与存储引擎的关系 - raolh - raolh的博客
  评论这张
 
阅读(1017)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017