MySQL查询事务状态字段的示例分析
发布时间:2022-01-12 10:59:22 所属栏目:MySql教程 来源:互联网
导读:这篇文章主要介绍了MySQL查询事务状态字段的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。 一、information_schema.INNODB_TRX 的trx_state字段 这个字段源码注释如下: tr
这篇文章主要介绍了MySQL查询事务状态字段的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。 一、information_schema.INNODB_TRX 的trx_state字段 这个字段源码注释如下: trx_que_t que_state; /*!< valid when trx->state == TRX_STATE_ACTIVE: TRX_QUE_RUNNING, TRX_QUE_LOCK_WAIT, ... */ /** Transaction execution states when trx->state == TRX_STATE_ACTIVE */ enum trx_que_t { TRX_QUE_RUNNING, /*!< transaction is running */ TRX_QUE_LOCK_WAIT, /*!< transaction is waiting for a lock */ TRX_QUE_ROLLING_BACK, /*!< transaction is rolling back */ TRX_QUE_COMMITTING /*!< transaction is committing */ }; 在测试中发现即便是commit下的也会是RUNNING状态,如下: MySQL查询事务状态字段的示例分析 因此主要取值有3个 TRX_QUE_RUNNING RUNNING TRX_QUE_LOCK_WAIT LOCK WAIT TRX_QUE_ROLLING_BACK ROLLING BACK 但是COMMITTING状态正确commit流程不触发。 二、information_schema.INNODB_TRX 的trx_operation_state字段 这个字段取值很多,标记了事务的各个阶段,主要来自于trx_t::op_info,在commit阶段有如下取值: MySQL查询事务状态字段的示例分析 其中preparing 和committing分别由函数trx_prepare_for_mysql和trx_commit_for_mysql进入,做完innodb层的prepare和commit后就会更改为NULL,实际的binlog的flush sync阶段不包含其中,实际也很好测试,可以做一个大事务,会发现 commit期间基本处于NULL状态: mysql> select * from information_schema.INNODB_TRX G *************************** 1. row *************************** trx_id: 66206 trx_state: RUNNING trx_started: 2019-08-23 23:44:05 trx_requested_lock_id: NULL trx_wait_started: NULL trx_weight: 1046257 trx_mysql_thread_id: 4 trx_query: commit trx_operation_state: NULL trx_tables_in_use: 0 trx_tables_locked: 1 trx_lock_structs: 2025 trx_lock_memory_bytes: 319960 trx_rows_locked: 1044232 trx_rows_modified: 1044232 trx_concurrency_tickets: 0 trx_isolation_level: READ COMMITTED ... 三、performance_schema.events_transactions_current 的STATE字段 这个值也只有3个取值: enum enum_transaction_state { TRANS_STATE_ACTIVE= 1, TRANS_STATE_COMMITTED= 2, TRANS_STATE_ROLLED_BACK= 3 }; TRANS_STATE_ACTIVE到TRANS_STATE_COMMITTED的转换会出现在innodb层提交完成后,也就是这个时候实际上整个prapare flush sync commit 已经结束了,之前一直除以ACTIVE状态,用处不大。如下: #0 pfs_end_transaction_v1 (locker=0x7ffee0014ba8, commit=1 ' |