返回首页
当前位置: 主页 > 网络编程 > Php实例教程 >

[MySQL源码] 一条简单insert语句的调用栈

时间:2012-09-05 13:39来源:知行网www.zhixing123.cn 编辑:麦田守望者

CREATE TABLE t1 (a INT PRIMARY KEY, b INT NOT NULL) ENGINE=InnoDB;

insert into t1 values (4,2);

ha_innobase::write_row

|–>row_insert_for_mysql

|–>转换记录格式row_mysql_convert_row_to_innobase

|–>保存检查点savept = trx_savept_take(trx);

|–>row_ins_step

|–>加IX锁lock_table(0, node->table, LOCK_IX, thr)

|–> row_ins //轮询索引,向表中插入记录,这里只有聚集索引

. |–>row_ins_index_entry_step

. |–>构建索引记录(node->entry)row_ins_index_entry_set_vals

. |–>row_ins_index_entry(node->index, node->entry, 0, TRUE, thr)

. . |–>检查外键约束row_ins_check_foreign_constraints

. . |->使用如下两步尝试插入记录

>>step1.row_ins_index_entry_low(BTR_MODIFY_LEAF, index, entry,n_ext, thr)/* Try first optimistic descent to the B-tree */

>>step2,若step1失败,row_ins_index_entry_low(BTR_MODIFY_TREE, index, entry,n_ext, thr);/* Try then pessimistic descent to the B-tree */

|–> row_ins_index_entry_low

|–>确定search_mode

1)如果是聚集索引,search_mode为传参BTR_MODIFY_LEAF或BTR_MODIFY_TREE

2)当前事务的check_unique_secondary为false时(由变量unique_checks控制,默认为true,表示检查唯一索引约束),search_mode = mode | BTR_INSERT | BTR_IGNORE_SEC_UNIQUE

3)否则,search_mode = mode | BTR_INSERT

|–>btr_cur_search_to_nth_level 查询索引树,将cursor移动到记录相应的位置(待分析)

|–>modify = row_ins_must_modify (待分析)

>>当modify!=0时,表明已经有一个足够长的common prefix,直接覆盖插入记录(待分析)

>>当modify=0时:

1)当mode=BTR_MODIFY_LEAF时,调用btr_cur_optimistic_insert,尝试向一个索引page中插入记录,如果页面空闲空间太小,则返回失败

|–>btr_cur_ins_lock_and_undo //检查是否有锁冲突,并插入undolog

|–>lock_rec_insert_check_and_lock //检查锁冲突

|–>没有下一个记录的锁冲突,即lock_rec_get_first返回NULL,更新二级索引trx id,返回

|–>调用lock_rec_other_has_conflicting,检查是否有其他事务锁有下一个记录的LOCK_X, LOCK_GAP和LOCK_INSERT_INTENTION锁

|–>检测到有冲突lock_rec_enqueue_waiting

|–> 创建锁记录lock_rec_create,type_code为LOCK_X | LOCK_GAP|LOCK_INSERT_INTENTION

|–>检测死锁

|–>如果是聚集索引且不是Insert buffer

|–>写入undo信息 trx_undo_report_row_operation(待分析)

|–>设置聚集索引记录的trx id和回滚段指针,row_upd_index_entry_sys_field

|–>插入记录page_cur_tuple_insert

|–>更新该page的哈希索引btr_search_update_hash_on_insert(待分析)

|–>升级锁?(inherit为TRUE),调lock_update_insert,这里不调用 (待分析)

2)否则

a)调用buf_LRU_buf_pool_running_out,返回true,表示少于25%的buffer pool可用。根据注释,对于大事务,会将锁存储在buffer pool中(待证实)

b)调用btr_cur_pessimistic_insert(待分析)

顶一下
(1)
100%
踩一下
(0)
0%
标签(Tag):数据库 MYSQL mysql数据库
------分隔线----------------------------
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
验证码:点击我更换图片