返回顶部
首页 > 资讯 > 数据库 >MySQL 如何查询当前最新事务ID
  • 671
分享到

MySQL 如何查询当前最新事务ID

MySQL事务IDMySQL查询事务ID 2022-05-26 21:05:58 671人浏览 泡泡鱼
摘要

写在前面:在个别时候可能需要查看当前最新的事务 ID,以便做一些业务逻辑上的判断(例如利用事务 ID 变化以及前后时差,统计每次事务的响应时长等用途)。 通常地,我们有两种方法可以查看当前的事务 ID: 1、执行 S

写在前面:在个别时候可能需要查看当前最新的事务 ID,以便做一些业务逻辑上的判断(例如利用事务 ID 变化以及前后时差,统计每次事务的响应时长等用途)。

通常地,我们有两种方法可以查看当前的事务 ID:

1、执行 SHOW ENGINE INNODB STATUS,查看事务相关信息


=====================================
150303 17:16:11 INNODB MONITOR OUTPUT
=====================================
Per second averages calculated from the last 15 seconds
...
------------
TRANSACTioNS
Trx id counter 3359877657 -- 当前最大事务 ID
Purge done for trx's n:o < 3359877468 undo n:o < 0 state: running
History list length 324
LIST OF TRANSACTIONS FOR EACH SESSION:
---TRANSACTION 0, not started -- 该会话中执行 SHOW ENGINE INNODB STATUS,不会产生事务,所以事务 ID 为 0
Mysql thread id 4692367, OS thread handle 0x51103940, query id 677284426 xx.173ops.com 10.x.x.x yejr init
SHOW  INNODB STATUS
---TRANSACTION 3359877640, not started --非活跃事务,还未开始
mysql tables in use 1, locked 0
Mysql thread id 4678384, OS thread handle 0x41a57940, query id 677284427 xx.173ops.com 10.x.x.x yejr System lock
select polinfo0_.Fid as Fid39_0_, ...

---TRANSACTION 3359877652, not started
MySQL thread id 4678383, OS thread handle 0x50866940, query id 677284420 xx.173ops.com 10.x.x.x yejr cleaning up

---TRANSACTION 3359877635, ACTIVE 1358 sec, thread declared inside InnoDB 5000 --活跃长事务,运行了 1358 秒还未结束,要引起注意,可能会导致大量等待发生
mysql tables in use 1, locked 1
1 lock struct(s), heap size 376, 0 row lock(s), undo log entries 1
MySQL thread id 3120717, OS thread handle 0x529b4940, query id 677284351 xx.173ops.com 10.x.x.x yejr query end
insert into t_live_room ...

2、查看 INFORMATION_SCHEMA.INNODB_TRX、INNODB_LOCKS、INNODB_LOCK_WAITS 三个表,通过这些信息能快速发现哪些事务在阻塞其他事务

先查询 INNODB_TRX 表,看看都有哪些事务


mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX\G
*************************** 1. row ***************************
 trx_id: 17778 -- 当前事务 ID
 trx_state: LOCK WaiT -- 处于锁等待状态,也就是等待其他会话释放锁资源
 trx_started: 2015-03-04 10:40:26
 trx_requested_lock_id: 17778:82:3:6 -- 欲请求的锁
 trx_wait_started: 2015-03-04 10:40:26
 trx_weight: 2 -- 大意是该锁影响了 2 行记录
 trx_mysql_thread_id: 657 -- processlist 中的线程 ID
 trx_query: update trx_fee set fee=rand()*1000 where id= 4
 trx_operation_state: starting index read
 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: REPEATABLE READ
 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-04 10: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: REPEATABLE READ
 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 * from information_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 --锁范围,记录锁:record lock,其他锁范围:间隙锁:gap lock,或者 next-key lock(记录锁+间隙锁)
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 * from information_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.29 INFORMATION_SCHEMA Tables for InnoDB

3、利用 percona 分支的特性,查看当前最新事务 ID,该特性从 5.6.11-60.3 版本开始引入,执行下面的 2 个命令即可查看


mysqladmin ext | grep Innodb_max_trx_id
或者
mysql> show global status like 'Innodb_max_trx_id';

最后,交代下问题的来源其实是这样的,有位朋友和我讨论问题,说在 java 连接池中,发现 2 个事务的事务 ID 是一样的,测试的 SQL 代码:


begin;update trx set un=rand() where id=round(rand()*10)+1;select * from information_schema.INNODB_TRX; commit;select sleep(0.01);begin;update trx set un=rand() where id=round(rand()*10)+1;select * from information_schema.INNODB_TRX;commit;

这串代码不能折行,中间的 sleep 停留 不能太大,也就是模拟足够快的情况下,检查 2 次事务的 ID 是否有变化。可以发现,时间足够短的话,2 次查询到的事务 ID 是一样的,并没有发生变化。大家也可以在自己的环境下试试。

以上就是MySQL 如何查询当前最新事务ID的详细内容,更多关于MySQL查询事务ID的资料请关注自学编程网其它相关文章!

您可能感兴趣的文档:

--结束END--

本文标题: MySQL 如何查询当前最新事务ID

本文链接: https://lsjlt.com/news/9736.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • MySQL 如何查询当前最新事务ID
    写在前面:在个别时候可能需要查看当前最新的事务 ID,以便做一些业务逻辑上的判断(例如利用事务 ID 变化以及前后时差,统计每次事务的响应时长等用途)。 通常地,我们有两种方法可以查看当前的事务 ID: 1、执行 S...
    99+
    2022-05-26
    MySQL 事务ID MySQL 查询事务ID
  • mysql如何查询最大id值
    这篇文章主要讲解了“mysql如何查询最大id值”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“mysql如何查询最大id值”吧! ...
    99+
    2024-04-02
  • mysql如何查询当前年份
    今天小编给大家分享一下mysql如何查询当前年份的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下...
    99+
    2022-11-30
    mysql
  • 如何查看MySQL当前的事务模式?
    我们可以运行“SELECT @@AUTOCOMMIT”命令来检查当前的事务模式。mysql> Select @@AUTOCOMMIT; +--------------------+ | @@AUTOCOMMIT | +--...
    99+
    2023-10-22
  • mysql如何查询当前登录的用户
    本文小编为大家详细介绍“mysql如何查询当前登录的用户”,内容详细,步骤清晰,细节处理妥当,希望这篇“mysql如何查询当前登录的用户”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识...
    99+
    2024-04-02
  • MySQL如何查询当前时间和日期
    要在MySQL中查询当前时间和日期,可以使用内置的函数NOW()或CURRENT_TIMESTAMP()。以下是两种方法: 1、使用...
    99+
    2024-04-09
    MySQL
  • 如何查看当前MySQL的事务隔离级别?
    通过执行SELECT @@TX_ISOLATION命令我们可以检查当前MySQL事务隔离级别。示例mysql> SELECT @@TX_ISOLATION; +-----------------+ | @@TX_ISOLATION ...
    99+
    2023-10-22
  • php如何查询当前时间
    这篇文章主要介绍“php如何查询当前时间”,在日常操作中,相信很多人在php如何查询当前时间问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”php如何查询当前时间”的疑惑有所帮助!接下来,请跟着小编一起来学习吧...
    99+
    2023-06-30
  • oracle如何查询sequence当前值
    要查询Oracle序列(sequence)的当前值,可以使用以下查询语句: SELECT last_number FROM ...
    99+
    2024-04-09
    oracle
  • MySQL如何查询当前仓库的字符集
    在MySQL中,可以使用以下命令查询当前仓库的字符集:```SHOW VARIABLES LIKE 'character_set_d...
    99+
    2023-09-25
    MySQL
  • mysql如何查询最新的记录
    这篇文章将为大家详细讲解有关mysql如何查询最新的记录,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。mysql查询最新的记录的方法:1、登录数据库;2、选择数据库;3、...
    99+
    2024-04-02
  • 如何查询当前vue的版本
    本篇内容主要讲解“如何查询当前vue的版本”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何查询当前vue的版本”吧!查询当前vue版本的两种方法:1、在cmd控制台内,执行“npm list ...
    99+
    2023-07-04
  • oracle如何查询序列当前值
    在Oracle中,要查询序列的当前值,可以使用如下的SQL语句: SELECT sequence_name.CURRVAL ...
    99+
    2024-04-09
    oracle
  • 如何查看mysql当前版本?
    第一步在我们的电脑上打开mysql控制台,输入密码进去,如下图所示:第二步输入“select version();”命令,按回车键,如下图所示:第三步可以看到mysql的版本号,如下图所示:第四步我们也可以...
    99+
    2024-04-02
  • mysql如何查看当前进程
    要查看当前MySQL进程,可以使用以下两种方法: 使用MySQL自带的SHOW PROCESSLIST命令。可以登录到MySQL控...
    99+
    2024-04-17
    mysql
  • MySQL中如何查询当前时间间隔前1天的数据
    这篇文章主要介绍“MySQL中如何查询当前时间间隔前1天的数据”,在日常操作中,相信很多人在MySQL中如何查询当前时间间隔前1天的数据问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”MySQL中如何查询当前时...
    99+
    2023-06-21
  • mysql如何查询最新的一条记录
    这篇文章给大家分享的是有关mysql如何查询最新的一条记录的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。 在mysql中,可以利用select...
    99+
    2024-04-02
  • ubuntu中如何查询当前所在目录
    ubuntu中查询当前所在目录的方法:1、打开ubuntu终端;2、输入“pwd”命令查询当前所在目录即可。具体操作方法如下:在ubuntu系统桌面使用快捷键【Ctrl+Alt+T】打开ubuntu终端命令行模式。在终端命令行中输入以下命令...
    99+
    2024-04-02
  • mysql当前连接数如何查看
    可以使用以下命令来查看当前连接数: SHOW STATUS WHERE `variable_name` = 'Th...
    99+
    2024-04-15
    mysql
  • mysql如何查看当前数据库
    在 MySQL 中,要查看当前正在使用的数据库,可以使用 SELECT DATABASE() 函数 SELECT DATABASE(...
    99+
    2024-05-09
    mysql
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作