返回顶部
首页 > 资讯 > 数据库 >如何找到上锁的SQL语句
  • 919
分享到

如何找到上锁的SQL语句

2024-04-02 19:04:59 919人浏览 独家记忆
摘要

本篇内容主要讲解“如何找到上锁的sql语句”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何找到上锁的SQL语句”吧! 问题有的时候 SQL 语句被锁

本篇内容主要讲解“如何找到上sql语句”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何找到上锁的SQL语句”吧!

 问题

有的时候 SQL 语句被锁住了,可是通过 show processlist 找不到加锁的的 SQL 语句,这个时候应该怎么排查呢

前提

perfORMance_schema = on;

实验

1、建一个表,插入三条数据

Mysql> use test1; Database changed mysql> create table action1(id int); Query OK, 0 rows affected (0.11 sec)   mysql> insert into action1 values(1),(2),(3); Query OK, 3 rows affected (0.00 sec) Records: 3  Duplicates: 0  Warnings: 0   mysql> select * from action1; +------+ | id   | +------+ |    1 | |    2 | |    3 | +------+3 rows in set (0.00 sec)

2、开启一个事务,删除掉一行记录,但不提交

mysql> begin; Query OK, 0 rows affected (0.00 sec)   mysql> delete from action1 where id = 3; Query OK, 1 row affected (0.00 sec)

3、另开启一个事务,更新这条语句,会被锁住

mysql> update action1 set id = 7 where id = 3;

4、通过 show processlist 只能看到一条正在执行的 SQL 语句

mysql> show processlist; | 22188 | root        | localhost          | test1 | Sleep   |  483 |          | NULL                                   | | 22218 | root        | localhost          | NULL  | Query   |    0 | starting | show processlist                       | | 22226 | root        | localhost          | test1 | Query   |    3 | updating | update action1 set id = 7 where id = 3 | +-------+-------------+--------------------+-------+---------+------+----------+----------------------------------------+

5、接下来就是我们知道的,通过 information_schema 库里的 INNODBTRX、INNODBLOCKS  、INNODBLOCK_WaiTS 获得的一个锁信息

mysql> select * from INNODB_LOCK_WAITS; +-------------------+-------------------+-----------------+------------------+ | requesting_trx_id | requested_lock_id | blocking_trx_id | blocking_lock_id | +-------------------+-------------------+-----------------+------------------+ | 5978292           | 5978292:542:3:2   | 5976374         | 5976374:542:3:2  | +-------------------+-------------------+-----------------+------------------+1 row in set, 1 warning (0.00 sec)   mysql> select * from INNODB_LOCKs; +-----------------+-------------+-----------+-----------+-------------------+-----------------+------------+-----------+----------+----------------+ | lock_id         | lock_trx_id | lock_mode | lock_type | lock_table        | lock_index      | lock_space | lock_page | lock_rec | lock_data      | +-----------------+-------------+-----------+-----------+-------------------+-----------------+------------+-----------+----------+----------------+ | 5978292:542:3:2 | 5978292     | X         | RECORD    | `test1`.`action1` | GEN_CLUST_INDEX |        542 |         3 |        2 | 0x00000029D504 | | 5976374:542:3:2 | 5976374     | X         | RECORD    | `test1`.`action1` | GEN_CLUST_INDEX |        542 |         3 |        2 | 0x00000029D504 | +-----------------+-------------+-----------+-----------+-------------------+-----------------+------------+-----------+----------+----------------+2 rows in set, 1 warning (0.00 sec)    mysql> select trx_id,trx_started,trx_requested_lock_id,trx_query,trx_mysql_thread_id from INNODB_TRX; +---------+---------------------+-----------------------+----------------------------------------+---------------------+ | trx_id  | trx_started         | trx_requested_lock_id | trx_query                              | trx_mysql_thread_id | +---------+---------------------+-----------------------+----------------------------------------+---------------------+ | 5978292 | 2020-07-26 22:55:33 | 5978292:542:3:2       | update action1 set id = 7 where id = 3 |               22226 | | 5976374 | 2020-07-26 22:47:33 | NULL                  | NULL                                   |               22188 | +---------+---------------------+-----------------------+----------------------------------------+---------------------+

6、从上面可以看出来是 thread_id 为 22188 的执行的 SQL 语句锁住了后面的更新操作,但是我们从上文中 show processlist  中并未看到这条事务,测试环境我们可以直接 kill 掉对应的线程号,但如果是生产环境中,我们需要找到对应的 SQL  语句,根据相应的语句再考虑接下来应该怎么处理

7、需要结合 performance_schema.threads 找到对应的事务号

mysql> select * from performance_schema.threads where processlist_ID = 22188\G *************************** 1. row ***************************           THREAD_ID: 22225  //perfoamance_schema中的事务计数器               NAME: thread/sql/one_connection                TYPE: FOREGROUND      PROCESSLIST_ID: 22188  //从show processlist中看到的id   PROCESSLIST_USER: root    PROCESSLIST_HOST: localhost      PROCESSLIST_DB: test1 PROCESSLIST_COMMAND: Sleep    PROCESSLIST_TIME: 1527  PROCESSLIST_STATE: NULL    PROCESSLIST_INFO: NULL    PARENT_THREAD_ID: NULL                ROLE: NULL        INSTRUMENTED: YES             HISTORY: YES     CONNECTION_TYPE: Socket        THREAD_OS_ID:8632 1 row in set (0.00 sec)

8、找到事务号,可以从 events_statements_current 找到对应的 SQL 语句:SQL_TEXT

mysql> select * from events_statements_current where THREAD_ID = 22225\G *************************** 1. row ***************************               THREAD_ID: 22225               EVENT_ID: 14           END_EVENT_ID: 14             EVENT_NAME: statement/sql/delete                  SOURCE:             TIMER_START: 546246699055725000              TIMER_END: 546246699593817000             TIMER_WAIT: 538092000              LOCK_TIME: 238000000               SQL_TEXT: delete from action1 where id = 3  //具体的sql语句                 DIGEST: 8f9cdb489c76ec0e324f947cc3faaa7c             DIGEST_TEXT: DELETE FROM `action1` WHERE `id` = ?          CURRENT_SCHEMA: test1             OBJECT_TYPE: NULL           OBJECT_SCHEMA: NULL             OBJECT_NAME: NULL   OBJECT_INSTANCE_BEGIN: NULL             MYSQL_ERRNO: 0      RETURNED_SQLSTATE: 00000           MESSAGE_TEXT: NULL                  ERRORS: 0               WARNINGS: 0          ROWS_AFFECTED: 1              ROWS_SENT: 0          ROWS_EXAMINED: 3CREATED_TMP_DISK_TABLES: 0     CREATED_TMP_TABLES: 0       SELECT_FULL_JOIN: 0 SELECT_FULL_RANGE_JOIN: 0           SELECT_RANGE: 0     SELECT_RANGE_CHECK: 0            SELECT_SCAN: 0      SORT_MERGE_PASSES: 0             SORT_RANGE: 0              SORT_ROWS: 0              SORT_SCAN: 0          NO_INDEX_USED: 0     NO_GoOD_INDEX_USED: 0       NESTING_EVENT_ID: NULL      NESTING_EVENT_TYPE: NULL     NESTING_EVENT_LEVEL: 01 row in set (0.00 sec)

9、可以看到是一条 delete 阻塞了后续的 update,生产环境中可以拿着这条 SQL 语句询问开发,是不是有 kill 的必要。

到此,相信大家对“如何找到上锁的SQL语句”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

您可能感兴趣的文档:

--结束END--

本文标题: 如何找到上锁的SQL语句

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

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

猜你喜欢
  • 如何找到上锁的SQL语句
    本篇内容主要讲解“如何找到上锁的SQL语句”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何找到上锁的SQL语句”吧! 问题有的时候 SQL 语句被锁...
    99+
    2024-04-02
  • 在mysql如何查找效率慢的SQL语句
    这篇文章主要介绍在mysql如何查找效率慢的SQL语句,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、MySQL数据库有几个配置选项可以帮助我们及时捕获低效SQL语句1,slow_...
    99+
    2024-04-02
  • 如何找出Mysql查询速度慢的SQL语句
    小编给大家分享一下如何找出Mysql查询速度慢的SQL语句,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!启动Mysql时加参数-...
    99+
    2024-04-02
  • ORACLE中怎么找到未提交事务的SQL语句
    这篇文章主要介绍了ORACLE中怎么找到未提交事务的SQL语句,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。在Oracle数据库中,我们能否...
    99+
    2024-04-02
  • 如何把sql语句结果输出到excel
    最近有一个需求,就是将数据库中某些数据整理出来制作成Excel表格,看了下数据库中的相关数据有将近六百条,如果手工一个个导出,基本上人也废了。。。 那有没有办法可以将查出来的数据直接导入到Excel中呢?我们可以使用如下SQL语句 sele...
    99+
    2014-12-24
    如何把sql语句结果输出到excel
  • 如何优化SQL语句
    这篇文章主要介绍“如何优化SQL语句”,在日常操作中,相信很多人在如何优化SQL语句问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何优化SQL语句”的疑惑有所帮助!接下来,...
    99+
    2024-04-02
  • 如何使用sql语句
    这篇文章给大家分享的是有关如何使用sql语句的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。update1、set一个字段在表t_test中设置第二条记录(bs为2)的p...
    99+
    2024-04-02
  • navicat如何写sql语句
    navicat 编写 sql 语句的步骤:连接数据库新建查询窗口编写 sql 语句执行查询保存查询示例 sql 语句:select * from table_name;inse...
    99+
    2024-06-25
    navicat sql语句
  • Java代码里如何拼接SQL语句到mybatis的xml
    关键语句: StringBuilder whereSql = new StringBuilder(); whereSql.append("SQL"); 实...
    99+
    2024-04-02
  • mysql的sql语句如何优化
    要优化MySQL的SQL语句,可以采取以下几个方法:1. 使用索引:使用适当的索引可以大大提高查询性能。可以使用`EXPLAIN`命...
    99+
    2023-09-27
    mysql sql
  • Linq To SQL如何输出SQL语句
    这篇文章将为大家详细讲解有关Linq To SQL如何输出SQL语句,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。最近在使用Linq To SQL的时候,为了了解不同Linq语句对性能造成的不同影响,需要...
    99+
    2023-06-17
  • 查找200-500之间的数据sql语句
    select * from T where id not in( select top 200 Id from T order by id) and Id in( selec&...
    99+
    2024-04-02
  • mysql怎么查找效率低的SQL语句
    本篇内容主要讲解“mysql怎么查找效率低的SQL语句”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“mysql怎么查找效率低的SQL语句”吧!MySQL通过慢查询日志定位那些执行效率较低的SQL...
    99+
    2023-06-01
  • sql更新语句如何写
    这篇文章将为大家详细讲解有关sql更新语句如何写,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。在SQL数据库中的更新语句要使用UPDATE语句来完成,UPDATE语句的作...
    99+
    2024-04-02
  • sql修改语句如何写
    小编给大家分享一下sql修改语句如何写,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!sql修改语句是UPDATE 语句。SQL ...
    99+
    2024-04-02
  • plsql如何运行sql语句
    在PL/SQL中运行SQL语句有多种方式:1. 使用SQLPlus:在SQLPlus命令行界面中,输入SQL语句并以分号(;)结尾,...
    99+
    2023-10-18
    plsql sql
  • plsql如何保存sql语句
    在PL/SQL中,可以使用变量来保存SQL语句。具体步骤如下:1. 声明一个变量来保存SQL语句,可以使用VARCHAR2类型的变量...
    99+
    2023-10-18
    plsql sql
  • thinkphp如何输出sql语句
    这篇文章主要介绍“thinkphp如何输出sql语句”,在日常操作中,相信很多人在thinkphp如何输出sql语句问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”thinkphp如何输出sql语句”的疑惑有所...
    99+
    2023-07-05
  • 排序sql语句如何写
    要编写排序SQL语句,你可以使用"ORDER BY"子句。该子句后面跟着你想要按照哪个列进行排序的列名,可以是一...
    99+
    2024-03-01
    sql
  • sql如何写循环语句
    sql 中没有传统的循环语句,但可使用递归 cte 模拟循环:创建递归 cte,包含"iteration"列来跟踪循环次数。递归查询更新"iteration"列并满足循环条件。使用 se...
    99+
    2024-06-06
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作