InnoDB是MySQL的一个存储引擎,支持事务,支持非堵塞的一致性读,物理存储结构是Page,每个事务都有回滚日志,重做日志,事务还会有死锁检测,各种各样不同的锁等等。
翻看InnoDB的源码,发现数下来开启一个事务的时候,InnoDB需要处理63个变量,变量类型纷繁复杂,结构体,自定义的数据类型等等。
这次整理,我翻看了不少同行们写的博客,包括InnoDB官方博客,有一个心得就是不同人的翻译不一样,尽管是官方写的博客,也会因为一些篇幅问题,减掉了一些细节的介绍。这次的整理,我特意保留了原来的英文备注,然后加上自己的理解进去。
MySQL的源码文件很多,InnoDB也不少,不过我觉得事务的结构体代码还是要理解透,透了才能理解透事务的实现细节,更加深入认识数据库系统为了保证数据的一致性,做了多少事情....
storage/innobase/include/trx0trx.h
变量类型 ulint #define ulint unsigned long
变量类型 ib_mutex_t
mutex的代码备注
Mutex protecting the fields state and lock (except some fields of lock, which are protected by lock_sys->mutex) Mutex保护字段的状态和锁定(除了某些锁定字段,由lock_sys-> mutex保护)
ib_mutex_t对应的结构体
这里面又有另外一个结构体 os_event_t
变量类型 trx_state_t 变量备注
事务状态TRX_STATE_NOT_STARTED TRX_STATE_ACTIVE TRX_STATE_PREPARED TRX_STATE_COMMITTED_IN_MEMORY (alias below COMMITTED)
结构体trx_state_t的源码
变量类型 trx_lock_t
变量备注
Information about the transaction locks and state. Protected by trx->mutex or lock_sys->mutex or both 事务锁和状态有关的信息。 受trx-> mutex或lock_sys-> mutex或两者保护。
trx_lock_t的结构体定义
变量类型 ulint 变量备注
0=normal transaction, 1=recovered, must be rolled back, protected by trx_sys->mutex when trx->in_rw_trx_list holds 0 =正常事务,1 =恢复,必须回滚,当trx-> in_rw_trx_list保持时由trx_sys-> mutex保护。
变量类型 const char*
变量类型 ulint 变量备注 READ UNCOMMITTED,READ COMMITTED,REPEATABLE READ,SERIALIZABLE
变量类型 unsigned 变量备注
MySQL has a transaction coordinator to coordinate two phase commit between multiple storage engines and the binary log. When an engine participates in a transaction, it's responsible for registering itself using the trans_register_ha() API. This flag is set to 1 after the transaction has been registered with the coordinator using the XA API, and is set to 0 after commit or rollback
MySQL有一个事务协调器来协调多个存储引擎和二进制日志之间的两阶段提交,它负责使用trans_register_ha()API注册自己。
在事务已使用XA API向协调器注册后,此标志设置为1,并在提交或回滚后设置为0。
变量类型 ulint
变量备注
通常为TRUE,但是如果用户想要通过抑制对二级索引的唯一键检查来加快插入,当我们决定是否可以为它们使用插入缓冲时,我们设置这个FALSE。
变量类型 ulint
变量备注 normally we do the XA two-phase commit steps, but by setting this to FALSE, one can save CPU time and about 150 bytes in the undo log size as then we skip XA steps
通常我们做XA两阶段提交步骤,但通过设置为FALSE,可以节省CPU时间和大约150字节的undo日志大小,然后我们跳过XA步骤。
变量类型 ulint
变量备注
In 2PC, we hold the prepare_commit mutex across both phases. In that case, we defer flush of the logs to disk until after we release the mutex
在两阶段提交,我们持有两个阶段的prepare_commit互斥体。 在这种情况下,我们推迟刷新日志到磁盘,直到我们释放互斥体。
变量类型 ulint
变量备注
this flag is set to TRUE in trx_commit() if flush_log_later was TRUE, and there were modifications by the transaction; in that case we must flush the log in trx_commit_complete_for_mysql()
此标志在trx_commit()中设置为TRUE,如果flush_log_later为TRUE,并且事务进行了修改; 在这种情况下,我们必须通过trx_commit_complete_for_mysql()刷新日志。
变量类型 ulint
变量备注 TRX_DUP_IGNORE | TRX_DUP_REPLACE
变量类型 ulint
变量备注
TRUE if this trx has latched the search system latch in S-mode 如果此trx已在S模式下锁定搜索系统锁存器,则为TRUE。
变量类型 ulint
变量备注
If we notice that someone is waiting for our S-lock on the search latch to be released, we wait in row0sel.cc for BTR_SEA_TIMEOUT new searches until we try to keep the search latch again over calls from MySQL; this is intended to reduce contention on the search latch
如果我们注意到有事务在等待我们的S锁锁定被释放,我们在row0sel.cc中等待BTR_SEA_TIMEOUT新的搜索,直到我们尝试保持搜索锁定再次超过来自MySQL的调用;这旨在减少对搜索锁存器的争用。
变量类型 trx_dict_op_t
变量备注
主要是三种状态 没有修改表结构=0 改表=1 修改索引=2
变量 ulint
备注
this is TRUE if we have declared this transaction in srv_conc_enter_innodb to be inside the InnoDB engine 如果我们已经在srv_conc_enter_innodb中声明这个事务在InnoDB引擎中,那么这是TRUE。
变量类型 ulint
变量备注
< this can be > 0 only when declared_to_... is TRUE; when we come to srv_conc_innodb_enter, if the value here is > 0, we decrement this by 1
<这可以> 0只有当declared_to_be_inside_innodb _…为TRUE 当我们来到srv_conc_innodb_enter,如果这里的值> 0,我们将其减1。
变量类型 ulint
变量备注
0, RW_S_LATCH, or RW_X_LATCH: the latch mode trx currently holds on dict_operation_lock. Protected by dict_operation_lock 0,RW_S_LATCH或RW_X_LATCH:锁存模式trx当前持有dict_operation_lock。 受dict_operation_lock保护。
变量类型 trx_id_t
变量备注
transaction serialization number: max trx id shortly before the transaction is moved to COMMITTED_IN_MEMORY state. Protected by trx_sys_t::mutex when trx->in_rw_trx_list. Initially set to TRX_ID_MAX
事务序列号:事务被移动到COMMITTED_IN_MEMORY状态之前不久的max trx id。 当trx-> in_rw_trx_list时,由trx_sys_t :: mutex保护。 最初设置为TRX_ID_MAX。
变量类型 time_t
变量备注 time the trx state last time became TRX_STATE_ACTIVE
trx状态变为TRX_STATE_ACTIVE的上一次时间(开始时间)
变量类型 trx_id_t
变量备注 transaction id 事务id
变量类型 XID
sql/handler.htypedef struct xid_t XID;
xid_t是一个结构体,代码太多,这里就不贴了。
变量备注 X/Open XA transaction identification to identify a transaction branch 打开分布式事务的标识,以便区分事务分支。
变量类型
/* Type used for all log sequence number storage and arithmetics */
typedef ib_uint64_t lsn_t;
变量备注
lsn at the time of the commit lsn提交的时间
变量类型 table_id_t
变量备注 Table to drop iff dict_operation == TRX_DICT_OP_TABLE, or 0。
变量类型 THD* 这是一个超级大的结构体,详情需要看代码。
变量备注
MySQL thread handle corresponding to this trx, or NULL 对应这个trx的MySQL线程句柄,或NULL。
变量类型 const char*
变量备注
if MySQL binlog is used, this field contains a pointer to the latest file name; this is NULL if binlog is not used
如果使用MySQL binlog,此字段包含指向最新文件名的指针; 如果不使用binlog,则为NULL。
变量类型 ib_int64_t
变量备注
if MySQL binlog is used, this field contains the end offset of the binlog entry
如果使用MySQL binlog,则此字段包含binlog条目的结束偏移量。
变量类型 ulint
变量备注 number of Innobase tables used in the processing of the current SQL statement in MySQL
MySQL中处理当前SQL语句时使用的Innobase表的数量。
变量类型 ulint
变量备注
how many tables the current SQL statement uses, except those in consistent read
变量类型 UT_LIST_NODE_T(trx_t)
变量备注
list of transactions; protected by trx_sys->mutex. The same node is used for both trx_sys_t::ro_trx_list and trx_sys_t::rw_trx_list
事务列表:受trx_sys->mutex保护。 同样的节点用于trx_sys_t :: ro_trx_list和trx_sys_t :: rw_trx_list。
变量类型 UT_LIST_NODE_T(trx_t)
变量备注
list of transactions created for MySQL; protected by trx_sys->mutex
变量类型 dberr_t
变量备注
0 if no error, otherwise error number; NOTE That ONLY the thread doing the transaction is allowed to set this field: this is NOT protected by any mutex
错误码 注意只有执行事务的线程才允许设置此字段 这不受任何互斥保护。
变量类型 const
变量备注
if the error number indicates a duplicate key error, a pointer to the problematic index is stored here 如果错误号表示重复键错误,则在此存储指向有问题索引的指针。
变量类型 ulint
变量备注
if the index creation fails to a duplicate key error, a mysql key number of that index is stored here
如果索引创建失败,重复的键错误,该索引的mysql键号存储在这里。
变量类型 sess_t*
变量备注
session of the trx, NULL if none
变量类型que_t*
变量备注
query currently run in the session, or NULL if none; NOTE that the query belongs to the session, and it can survive over a transaction commit, if it is a stored procedure with a COMMIT WORK statement, for instance
查询当前在运行中的会话,如果没有则为NULL 注意,查询属于会话,并且它可以通过事务提交存活,如果它是具有COMMIT WORK语句的存储过程。
变量类型 mem_heap_t*
/* A memory heap is a nonempty linear list of memory blocks */typedef mem_block_t mem_heap_t;/* A block of a memory heap consists of the info structure
followed by an area of memory */typedef struct mem_block_info_t mem_block_t;mem_block_info_t又是一个复杂的结构体
变量备注
memory heap for the global read view 内存堆的全局读取视图
变量类型 read_view_t* 又是一个比较复杂的结构体
一致的读取视图关联到事务或NULL
变量类型 read_view_t* 变量备注
consistent read view used in the transaction or NULL, this read view if defined can be normal read view associated to a transaction (i.e. same as global_read_view) or read view associated to a cursor
一致的读取视图用于事务或NULL,此读取视图如果定义可以是与事务相关联的正常读取视图(即与global_read_view相同)或与光标相关联的读取视图。
变量类型 UT_LIST_BASE_NODE_T(trx_named_savept_t)
变量备注 savepoints set with SAVEPOINT ..., oldest first 使用SAVEPOINT设置保存点的列表 ...,最旧的放在最前面。
变量类型 ib_mutex_t
变量备注 mutex protecting the fields in this section (down to undo_no_arr), EXCEPT last_sql_stat_start, which can be accessed only when we know that there cannot be any activity in the undo logs!
互斥体保护此部分中的字段(向下到undo_no_arr),除了 last_sql_stat_start,只有当我们知道在撤销日志中不能有任何活动时才可以访问它们!
变量类型undo_no_t
/** Undo number */typedef ib_id_t undo_no_t;
变量备注
next undo log record number to assign; since the undo log is private for a transaction, this is a simple ascending sequence with no gaps; thus it represents the number of modified/inserted rows in a transaction
分配下一个撤销日志记录号; 因为撤销日志对于事务是私有的,这是一个没有间隙的简单升序序列;因此它表示事务中修改/插入行的数量。
变量类型 trx_savept_t
变量备注 undo_no when the last sql statement was started: in case of an error, trx is rolled back down to this undo number; see note at undo_mutex
当最后一个SQL语句启动时,分配undo_no:在出现错误的情况下,trx被回滚到这个撤销号; 请参见undo_mutex中的注释。
变量类型 trx_rseg_t* 这又是一个比较复杂的结构体,但segement其实是和Page绑定在一起的, 变量备注
rollback segment assigned to the transaction, or NULL if not assigned yet
回滚段分配给事务,如果尚未分配,则为NULL。
变量类型 trx_undo_t*
变量备注
pointer to the insert undo log, or NULL if no inserts performed yet
指向插入undo日志的指针,如果尚未执行插入,则为NULL。
变量类型 trx_undo_t*
变量备注 pointer to the update undo log, or NULL if no update performed yet
变量类型 undo_no_t
变量备注 least undo number to undo during a rollback
事务回滚的时候,最小的回滚数
变量类型 ulint
变量备注 number of undo log pages undone since the last undo log truncation
自上次撤消日志截断以来撤销日志页面的数量。
变量类型 trx_undo_arr_t*
变量备注 array of undo numbers of undo log records which are currently processed by a rollback operation
撤消日志记录的撤销编号数组,这些撤消日志记录当前由回滚操作处理。
变量类型ulint
变量备注 no. of AUTO-INC rows required for an SQL statement. This is useful for multi-row INSERTs
SQL语句所需的AUTO-INC行的数量。 这对于多行INSERT非常有用。
变量类型 ib_vector_t*
变量备注
AUTOINC locks held by this transaction. Note that these are also in the lock list trx_locks. This vector needs to be freed explicitly when the trx instance is destroyed. Protected by lock_sys->mutex
此事务持有的AUTOINC锁。
注意,这些也在锁定列表trx_locks中。 当trx实例被销毁时,这个向量需要被明确地释放。 受lock_sys-> mutex保护。
变量类型 ibool
变量备注 TRUE if transaction is flagged as a READ-ONLY transaction. if !auto_commit || will_lock > 0 then it will added to the list trx_sys_t::ro_trx_list. A read only transaction will not be assigned an UNDO log. Non-locking auto-commit read-only transaction will not be on either list
如果事务标记为READ-ONLY事务,则为TRUE。 if!auto_commit || will_lock> 0,那么它将被添加到列表trx_sys_t :: ro_trx_list。
只读事务将不会被分配UNDO日志。 非锁定自动提交只读事务将不在任一列表上。
变量类型 ibool
变量备注 TRUE if it is an autocommit
变量类型 ulint
变量备注
Will acquire some locks. Increment each time we determine that a lock will be acquired by the MySQL layer
标记会获得一些锁。 每次我们确定需要获取锁的时候,将被MySQL层获取时递增。
变量类型 bool
变量备注 true if it is a transaction that is being started for a DDL operation
如果它是为DDL操作启动的事务,则为true。
变量类型 fts_trx_t*
变量类型 FTS information, or NULL if transaction hasn't modified tables with FTS indexes (yet)
FTS信息,如果事务尚未修改具有FTS索引的表(尚未),则为NULL。
变量类型 doc_id_t
变量备注
The document id used for updates 用于更新的文档ID
变量类型 ulint
变量备注 if "covering" the FLUSH TABLES",count of tables being flushed
如果“覆盖”FLUSH TABLES“,则表的计数被刷新。
变量类型 bool
变量备注 trx started by InnoDB API
变量类型 bool
变量备注 automatic commit
变量类型 bool
变量备注 if read and write operation
变量类型char
变量备注 detailed error message for last error, or empty
作者介绍 杨德华
微店高级技术专家,前阿里集团数据库技术团队专家,花名应元,曾经历过5年双十一的数据库大考验。
经平台及作者同意授权转载
来源:德华Talk 订阅号
如果字段的最大可能长度超过255字节,那么长度值可能…
只能说作者太用心了,优秀
感谢详解
一般干个7-8年(即30岁左右),能做到年入40w-50w;有…
230721