MySQL查询事务状态字段的示例分析
发表于:2025-01-21 作者:千家信息网编辑
千家信息网最后更新 2025年01月21日,这篇文章主要介绍了MySQL查询事务状态字段的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、information_sch
千家信息网最后更新 2025年01月21日MySQL查询事务状态字段的示例分析
这篇文章主要介绍了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状态,如下:
因此主要取值有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阶段有如下取值:
其中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 '\001') at /mysqldata/percona-server-locks-detail-5.7.22/storage/perfschema/pfs.cc:6116#1 0x0000000000f7d177 in inline_mysql_commit_transaction (locker=0x7ffee0014ba8) at /mysqldata/percona-server-locks-detail-5.7.22/include/mysql/psi/mysql_transaction.h:206#2 0x0000000000f8026c in ha_commit_trans (thd=0x7ffee00129d0, all=true, ignore_global_read_lock=false) at /mysqldata/percona-server-locks-detail-5.7.22/sql/handler.cc:1843#3 0x00000000016dcd2f in trans_commit (thd=0x7ffee00129d0) at /mysqldata/percona-server-locks-detail-5.7.22/sql/transaction.cc:239#4 0x00000000015cf466 in mysql_execute_command (thd=0x7ffee00129d0, first_level=true) at /mysqldata/percona-server-locks-detail-5.7.22/sql/sql_parse.cc:4526#5 0x00000000015d2fde in mysql_parse (thd=0x7ffee00129d0, parser_state=0x7fffec5ee600) at /mysqldata/percona-server-locks-detail-5.7.22/sql/sql_parse.cc:5901#6 0x00000000015c6b72 in dispatch_command (thd=0x7ffee00129d0, com_data=0x7fffec5eed70, command=COM_QUERY) at /mysqldata/percona-server-locks-detail-5.7.22/sql/sql_parse.cc:1490#7 0x00000000015c58ff in do_command (thd=0x7ffee00129d0) at /mysqldata/percona-server-locks-detail-5.7.22/sql/sql_parse.cc:1021#8 0x000000000170e578 in handle_connection (arg=0x67d6410) at /mysqldata/percona-server-locks-detail-5.7.22/sql/conn_handler/connection_handler_per_thread.cc:312#9 0x0000000001945538 in pfs_spawn_thread (arg=0x67be520) at /mysqldata/percona-server-locks-detail-5.7.22/storage/perfschema/pfs.cc:2190#10 0x00007ffff7bcfaa1 in start_thread () from /lib64/libpthread.so.0#11 0x00007ffff6b37c4d in clone () from /lib64/libc.so.6(gdb) n6117 DBUG_ASSERT(state != NULL);(gdb) n6119 ulonglong timer_end= 0;(gdb) n6120 ulonglong wait_time= 0;(gdb) n6121 uint flags= state->m_flags;(gdb) n6123 if (flags & STATE_FLAG_TIMED)(gdb) n6125 timer_end= state->m_timer();(gdb) n6126 wait_time= timer_end - state->m_timer_start;(gdb) n6131 if (flags & STATE_FLAG_THREAD)(gdb) n6133 PFS_thread *pfs_thread= reinterpret_cast(state->m_thread);(gdb) n6134 DBUG_ASSERT(pfs_thread != NULL);(gdb) n6137 stat= &pfs_thread->write_instr_class_transactions_stats()[GLOBAL_TRANSACTION_INDEX];(gdb) n6139 if (flags & STATE_FLAG_EVENT)(gdb) n6141 PFS_events_transactions *pfs= reinterpret_cast (state->m_transaction);(gdb) n6142 DBUG_ASSERT(pfs != NULL);(gdb) n6145 if (unlikely(pfs->m_class == NULL))(gdb) n6148 pfs->m_timer_end= timer_end;(gdb) n6149 pfs->m_end_event_id= pfs_thread->m_event_id;(gdb) n6151 pfs->m_state= (commit ? TRANS_STATE_COMMITTED : TRANS_STATE_ROLLED_BACK);(gdb) p pfs->m_state$1 = TRANS_STATE_ACTIVE
感谢你能够认真阅读完这篇文章,希望小编分享的"MySQL查询事务状态字段的示例分析"这篇文章对大家有帮助,同时也希望大家多多支持,关注行业资讯频道,更多相关知识等着你来学习!
字段
状态
事务
篇文章
实际
阶段
示例
分析
查询
测试
不大
也就是
价值
兴趣
函数
只有
同时
实际上
时候
更多
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
赛元微方案软件开发
软件开发招学徒吗
真人交友软件开发
物理删除怎么操作数据库数据
网络安全操作系统维护
大数据软件开发好学嘛
惯彻执行《网络安全法》
服务器 256g内存
河北it 软件开发java
对爸爸北京网络技术研究院
计量管理软件开发
oracle数据库的ed
连接数据库的jar包怎么弄
数据库系统第二版答案
服务器技术方案模板
4g开服务器
逃离塔科夫法国服务器怎么样
长沙国皓网络技术有限公司
mysql数据库打开工具
网络安全弱口令有什么要求
华南师范大学软件开发专业怎么样
苹果如何信任软件开发者
南山区区块链软件开发公司
怎么入公安DNA数据库
服务器如何远程到桌面
软件开发语言方案
济南分销软件开发哪家做的好
oracle数据库的ed
jsp连接sql数据库
分布式数据库的组成部分