您好,登錄后才能下訂單哦!
本篇內容主要講解“MySQL中Innodb關于Handler_commit每次DML增加2的原因是什么”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“MySQL中Innodb關于Handler_commit每次DML增加2的原因是什么”吧!
請教一個問題。我每次insert一條語句,查詢show global status like 'Handler_commit'; 發現每次增加值是2,難道不應該是1嗎? 最簡單的insert into table a values(1);
語句如下:
mysql> flush status; Query OK, 0 rows affected (0.10 sec) mysql> set sql_log_bin=1; Query OK, 0 rows affected (0.01 sec) mysql> insert into testm values(16,'gaopeng',34); Query OK, 1 row affected (0.15 sec) mysql> show status like '%commit%'; +----------------+-------+| Variable_name | Value | +----------------+-------+ | Com_commit | 0 || Com_xa_commit | 0 | | Handler_commit | 2 |+----------------+-------+3 rows in set (0.01 sec)
問為什么 Handler_commit是2而不是1。
其實對于這個問題只要看看這個Handler_commit指標增加的方式就可以看出原因。實際上這個指標出現在ha_commit_low函數中如下:
for (; ha_info; ha_info= ha_info_next) { int err; handlerton *ht= ha_info->ht(); if ((err= ht->commit(ht, thd, all))) { my_error(ER_ERROR_DURING_COMMIT, MYF(0), err); error=1; } DBUG_ASSERT(!thd->status_var_aggregated); thd->status_var.ha_commit_count++; //此處增加 ha_info_next= ha_info->next(); if (restore_backup_ha_data) reattach_engine_ha_data_to_thd(thd, ht); ha_info->reset(); /* keep it conveniently zero-filled */ }
可以清楚的看到ha_commit_count實際就是調用ht->commit的次數,由于有多個Handler的存在,因此這里需要調用多次。對于開啟binlog+innodb的這種結構來講分別要做:
binlog的commit
Innodb的commit
后面會看到實際binlog的commit什么都沒做,但是這是一種協議。
那么如果我們關閉binlog可以發現Handler_commit為1了如下:
mysql> set sql_log_bin=0; Query OK, 0 rows affected (0.00 sec) mysql> insert into testm values(15,'gaopeng',34); Query OK, 1 row affected (0.10 sec) mysql> show status like '%commit%'; +----------------+-------+| Variable_name | Value | +----------------+-------+ | Com_commit | 0 || Com_xa_commit | 0 | | Handler_commit | 1 |+----------------+-------+3 rows in set (0.01 sec)
#0 binlog_commit (hton=0x3485e30, thd=0x7fff2c014430, all=false) at /root/mysql5.7.14/percona-server-5.7.14-7/sql/binlog.cc:1833#1 0x0000000000f64104 in ha_commit_low (thd=0x7fff2c014430, all=false, run_after_commit=false) at /root/mysql5.7.14/percona-server-5.7.14-7/sql/handler.cc:1923#2 0x000000000185772b in MYSQL_BIN_LOG::process_commit_stage_queue (this=0x2e01c80, thd=0x7fff2c014430, first=0x7fff2c014430) at /root/mysql5.7.14/percona-server-5.7.14-7/sql/binlog.cc:8647#3 0x0000000001858f5d in MYSQL_BIN_LOG::ordered_commit (this=0x2e01c80, thd=0x7fff2c014430, all=false, skip_commit=false) at /root/mysql5.7.14/percona-server-5.7.14-7/sql/binlog.cc:9318#4 0x000000000185700c in MYSQL_BIN_LOG::commit (this=0x2e01c80, thd=0x7fff2c014430, all=false) at /root/mysql5.7.14/percona-server-5.7.14-7/sql/binlog.cc:8440#5 0x0000000000f63df8 in ha_commit_trans (thd=0x7fff2c014430, all=false, ignore_global_read_lock=false) at /root/mysql5.7.14/percona-server-5.7.14-7/sql/handler.cc:1818
但是實際上binlog_commit什么都沒做,因為在此之前他已經做完了需要做的事情比如flush、sync等
static int binlog_commit(handlerton *hton, THD *thd, bool all){ DBUG_ENTER("binlog_commit"); /* Nothing to do (any more) on commit. */ DBUG_RETURN(0); }
#0 innobase_commit (hton=0x2e9edd0, thd=0x7fff2c014430, commit_trx=false) at /root/mysql5.7.14/percona-server-5.7.14-7/storage/innobase/handler/ha_innodb.cc:4652#1 0x0000000000f64104 in ha_commit_low (thd=0x7fff2c014430, all=false, run_after_commit=false) at /root/mysql5.7.14/percona-server-5.7.14-7/sql/handler.cc:1923#2 0x000000000185772b in MYSQL_BIN_LOG::process_commit_stage_queue (this=0x2e01c80, thd=0x7fff2c014430, first=0x7fff2c014430) at /root/mysql5.7.14/percona-server-5.7.14-7/sql/binlog.cc:8647#3 0x0000000001858f5d in MYSQL_BIN_LOG::ordered_commit (this=0x2e01c80, thd=0x7fff2c014430, all=false, skip_commit=false) at /root/mysql5.7.14/percona-server-5.7.14-7/sql/binlog.cc:9318#4 0x000000000185700c in MYSQL_BIN_LOG::commit (this=0x2e01c80, thd=0x7fff2c014430, all=false) at /root/mysql5.7.14/percona-server-5.7.14-7/sql/binlog.cc:8440#5 0x0000000000f63df8 in ha_commit_trans (thd=0x7fff2c014430, all=false, ignore_global_read_lock=false) at /root/mysql5.7.14/percona-server-5.7.14-7/sql/handler.cc:1818
實際上innodb comit才是需要真正做的,這里包含一些事情要做,比如事物狀態的改變,資源的釋放。
最后select也會增加Handler_commit,增加為1。
到此,相信大家對“MySQL中Innodb關于Handler_commit每次DML增加2的原因是什么”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。