MySQL 如何查询当前最新事务ID
写在前面:在个别时候可能需要查看当前最新的事务ID,以便做一些业务逻辑上的判断(例如利用事务ID变化以及前后时差,统计每次事务的响应时长等用途)。
通常地,我们有两种方法可以查看当前的事务ID:
1、执行SHOWENGINEINNODBSTATUS,查看事务相关信息
===================================== 15030317:16:11INNODBMONITOROUTPUT ===================================== Persecondaveragescalculatedfromthelast15seconds ... ------------ TRANSACTIONS Trxidcounter3359877657--当前最大事务ID Purgedonefortrx'sn:o<3359877468undon:o<0state:running Historylistlength324 LISTOFTRANSACTIONSFOREACHSESSION: ---TRANSACTION0,notstarted--该会话中执行SHOWENGINEINNODBSTATUS,不会产生事务,所以事务ID为0 MySQLthreadid4692367,OSthreadhandle0x51103940,queryid677284426xx.173ops.com10.x.x.xyejrinit SHOW/*!50000ENGINE*/INNODBSTATUS ---TRANSACTION3359877640,notstarted--非活跃事务,还未开始 mysqltablesinuse1,locked0 MySQLthreadid4678384,OSthreadhandle0x41a57940,queryid677284427xx.173ops.com10.x.x.xyejrSystemlock selectpolinfo0_.FidasFid39_0_,... ---TRANSACTION3359877652,notstarted MySQLthreadid4678383,OSthreadhandle0x50866940,queryid677284420xx.173ops.com10.x.x.xyejrcleaningup ---TRANSACTION3359877635,ACTIVE1358sec,threaddeclaredinsideInnoDB5000--活跃长事务,运行了1358秒还未结束,要引起注意,可能会导致大量锁等待发生 mysqltablesinuse1,locked1 1lockstruct(s),heapsize376,0rowlock(s),undologentries1 MySQLthreadid3120717,OSthreadhandle0x529b4940,queryid677284351xx.173ops.com10.x.x.xyejrqueryend insertintot_live_room...
2、查看INFORMATION_SCHEMA.INNODB_TRX、INNODB_LOCKS、INNODB_LOCK_WAITS三个表,通过这些信息能快速发现哪些事务在阻塞其他事务
先查询INNODB_TRX表,看看都有哪些事务
mysql>SELECT*FROMINFORMATION_SCHEMA.INNODB_TRX\G ***************************1.row*************************** trx_id:17778--当前事务ID trx_state:LOCKWAIT--处于锁等待状态,也就是等待其他会话释放锁资源 trx_started:2015-03-0410:40:26 trx_requested_lock_id:17778:82:3:6--欲请求的锁 trx_wait_started:2015-03-0410:40:26 trx_weight:2--大意是该锁影响了2行记录 trx_mysql_thread_id:657--processlist中的线程ID trx_query:updatetrx_feesetfee=rand()*1000whereid=4 trx_operation_state:startingindexread trx_tables_in_use:1 trx_tables_locked:1 trx_lock_structs:2 trx_lock_memory_bytes:360 trx_rows_locked:1 trx_rows_modified:0 trx_concurrency_tickets:0 trx_isolation_level:REPEATABLEREAD trx_unique_checks:1 trx_foreign_key_checks:1 trx_last_foreign_key_error:NULL trx_adaptive_hash_latched:0 trx_adaptive_hash_timeout:10000 trx_is_read_only:0 trx_autocommit_non_locking:0 ***************************2.row*************************** trx_id:17773 trx_state:RUNNING trx_started:2015-03-0410:40:23 trx_requested_lock_id:NULL trx_wait_started:NULL trx_weight:10 trx_mysql_thread_id:656 trx_query:NULL trx_operation_state:NULL trx_tables_in_use:0 trx_tables_locked:0 trx_lock_structs:2 trx_lock_memory_bytes:360 trx_rows_locked:9 trx_rows_modified:8 trx_concurrency_tickets:0 trx_isolation_level:REPEATABLEREAD trx_unique_checks:1 trx_foreign_key_checks:1 trx_last_foreign_key_error:NULL trx_adaptive_hash_latched:0 trx_adaptive_hash_timeout:10000 trx_is_read_only:0 trx_autocommit_non_locking:0
再看INNODB_LOCKS表,看看都有什么锁
mysql>select*frominformation_schema.INNODB_LOCKS\G ***************************1.row*************************** lock_id:17778:82:3:6--当前锁ID lock_trx_id:17778--该锁对应的事务ID lock_mode:X--锁类型,排它锁X lock_type:RECORD--锁范围,记录锁:recordlock,其他锁范围:间隙锁:gaplock,或者next-keylock(记录锁+间隙锁) lock_table:`test`.`trx_fee` lock_index:PRIMARY--加载在哪个索引上的锁 lock_space:82 lock_page:3 lock_rec:6 lock_data:4 ***************************2.row*************************** lock_id:17773:82:3:6 lock_trx_id:17773 lock_mode:X lock_type:RECORD lock_table:`test`.`trx_fee` lock_index:PRIMARY lock_space:82 lock_page:3 lock_rec:6 lock_data:4
最后看INNODB_LOCK_WAITS表,看看当前都有哪些锁等待
mysql>select*frominformation_schema.INNODB_LOCK_WAITS\G ***************************1.row*************************** requesting_trx_id:17778--请求锁的事务ID(等待方) requested_lock_id:17778:82:3:6--请求锁ID blocking_trx_id:17773--阻塞该锁的事务ID(当前持有方,待释放) blocking_lock_id:17773:82:3:6--持有的锁ID
关于INFORMATION_SCHEMA中和InnoDB有关的表用途描述,可以查看手册:21.29INFORMATION_SCHEMATablesforInnoDB
3、利用percona分支的特性,查看当前最新事务ID,该特性从5.6.11-60.3版本开始引入,执行下面的2个命令即可查看
mysqladminext|grepInnodb_max_trx_id 或者 mysql>showglobalstatuslike'Innodb_max_trx_id';
最后,交代下问题的来源其实是这样的,有位朋友和我讨论问题,说在java连接池中,发现2个事务的事务ID是一样的,测试的SQL代码:
begin;updatetrxsetun=rand()whereid=round(rand()*10)+1;select*frominformation_schema.INNODB_TRX;commit;selectsleep(0.01);begin;updatetrxsetun=rand()whereid=round(rand()*10)+1;select*frominformation_schema.INNODB_TRX;commit;
这串代码不能折行,中间的sleep停留不能太大,也就是模拟足够快的情况下,检查2次事务的ID是否有变化。可以发现,时间足够短的话,2次查询到的事务ID是一样的,并没有发生变化。大家也可以在自己的环境下试试。
以上就是MySQL如何查询当前最新事务ID的详细内容,更多关于MySQL查询事务ID的资料请关注毛票票其它相关文章!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。