iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >mysql事务未提交导致锁等待如何解决
  • 157
分享到

mysql事务未提交导致锁等待如何解决

2024-04-02 19:04:59 157人浏览 薄情痞子
摘要

1、实验环境Myql版本5.7.17-log实验表结构(root@localhost)[apex]> show create table test; +----

1、实验环境

Myql版本5.7.17-log

实验表结构

(root@localhost)[apex]> show create table test;
+-------+-----------------------------------------------------------------------------------------------------------------------------------+
| Table| Create Table                                                                                                                     |
+-------+-----------------------------------------------------------------------------------------------------------------------------------+
|test  | CREATE TABLE `test` (
  `x` int(11) NOT NULL,
  `y` int(11) DEFAULT NULL,
  PRIMARY KEY (`x`)
)ENGINE=InnoDB DEFAULT CHARSET=gbk |
+-------+-----------------------------------------------------------------------------------------------------------------------------------+
1 row inset (0.01 sec)

插入数据

(root@localhost)[apex]> insert into test values(1,1);
(root@localhost)[apex]> insert into test values(2,2);
(root@localhost)[apex]> insert into test values(3,3);

2、产生步骤

会话一:开启事务,更新数据,不提交

(root@localhost)[apex]> begin;
QueryOK, 0 rows affected (0.00 sec)
(root@localhost)[apex]> update test set y=y+1 where x=1;
QueryOK, 1 row affected (0.00 sec)
Rowsmatched: 1  Changed: 1  Warnings: 0

查看当前连接id号(线程id号)

(root@localhost)[apex]> select connection_id();
+-----------------+
|connection_id() |
+-----------------+
|               4 |
+-----------------+
1 row inset (0.00 sec)

会话二:开启另一个事务,更新同一行数据,

(root@localhost)[apex]> begin;
QueryOK, 0 rows affected (0.00 sec)
 
(root@localhost)[apex]> update test set y=y+1 where x=1;
ERROR1205 (HY000): Lock wait timeout exceeded; try restarting transaction

执行update test set操作时,会卡在那边,不执行,经过50秒后,会报错;

(上面的卡住现象,是由于锁,可以通过查看表infORMation_schema.innodb_lock,获取锁的状态)

(root@localhost)[information_schema]> select * from information_schema.innodb_locks;
+-----------------+-------------+-----------+-----------+---------------+------------+------------+-----------+----------+-----------+
|lock_id         | lock_trx_id | lock_mode| lock_type | lock_table    | lock_index| lock_space | lock_page | lock_rec | lock_data |
+-----------------+-------------+-----------+-----------+---------------+------------+------------+-----------+----------+-----------+
|757082:3279:3:2 | 757082      | X         | RECORD    | `apex`.`test` | PRIMARY    |      3279 |         3 |       2 | 1         |
|757081:3279:3:2 | 757081      | X         | RECORD    | `apex`.`test` | PRIMARY    |      3279 |         3 |        2 | 1         |
+-----------------+-------------+-----------+-----------+---------------+------------+------------+-----------+----------+-----------+
2 rowsin set, 1 warning (0.00 sec)

查看当前连接id号(线程id号)

 (root@localhost) [apex]> selectconnection_id();
+-----------------+
|connection_id() |
+-----------------+
|               5 |
+-----------------+
1 row inset (0.00 sec)

以上说的50秒,是系统参数innodb_lock_wait_timeout决定的

(root@localhost)[apex]> show variables like 'innodb_lock_wait_timeout';
+--------------------------+-------+
|Variable_name            | Value |
+--------------------------+-------+
| innodb_lock_wait_timeout|  50  |
+--------------------------+-------+
1 row inset (0.00 sec)

3、Mysql 如何查看未提交的事务

方法一:

(root@localhost)[performance_schema]>  SELECT * FROMinformation_schema.INNODB_TRX\G
***************************1. row ***************************
                    trx_id: 756996
                 trx_state: RUNNING
               trx_started: 2017-05-08 15:08:07
     trx_requested_lock_id: NULL
          trx_wait_started: NULL
                trx_weight: 3
       trx_mysql_thread_id: 4
                 trx_query: NULL
       trx_operation_state: NULL
         trx_tables_in_use: 0
         trx_tables_locked: 1
          trx_lock_structs: 2
     trx_lock_memory_bytes: 1136
           trx_rows_locked: 1
         trx_rows_modified: 1
   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: 0
          trx_is_read_only: 0
trx_autocommit_non_locking:0
1 row inset (0.00 sec)

通过以上可看出线程id为4 一直未提交,事务开始的时间为2017-05-08 15:08:07。

方法二:通过 show engine innodb status\G

其中有一段关于事务的描述

TRANSACTIONS
------------
Trx idcounter 756998
Purgedone for trx's n:o < 0 undo n:o < 0 state: running but idle
Historylist length 0
LIST OFTRANSACTIONS FOR EACH SESSION:
---TRANSACTION421519065333360, not started
0 lockstruct(s), heap size 1136, 0 row lock(s)
---TRANSACTION421519065332448, not started
0 lockstruct(s), heap size 1136, 0 row lock(s)
---TRANSACTION756996, ACTIVE 914 sec
2 lockstruct(s), heap size 1136, 1 row lock(s), undo log entries 1
Mysql thread id 4, OS thread handle 140041791522560, query id25 localhost root

从以上也可以看出线程id号为4的事务一直未提交。

4、如何解决未提交的事务

方法一:如果能知道哪个用户在执行这个操作,让他提交一下(这种可能性很小)

方法二:kill掉这个线程id号,让事务回滚,

(root@localhost)[information_schema]> show processlist;
+----+-----------------+------------------+--------------------+---------+------+------------------------+------------------+
| Id |User            | Host             | db                 | Command | Time | State                  | Info             |
+----+-----------------+------------------+--------------------+---------+------+------------------------+------------------+
|  1 | event_scheduler | localhost        | NULL               | Daemon  | 4469 | Waiting on empty queue | NULL             |
|  4 | root            | localhost        | apex               | Sleep   |  871|                        | NULL             |
|  5 | root            | localhost        | apex               | Sleep   |   82|                        | NULL             |
|  6 | root            | localhost        | information_schema | Query   |    0| starting               | showprocesslist |
|  7 | root            | 192.168.1.1:3708 | NULL               | Sleep   | 3221 |                        | NULL             |
+----+-----------------+------------------+--------------------+---------+------+------------------------+------------------+
5 rowsin set (0.00 sec)
 
(root@localhost)[information_schema]> kill 4;
QueryOK, 0 rows affected (0.01 sec)

 


您可能感兴趣的文档:

--结束END--

本文标题: mysql事务未提交导致锁等待如何解决

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

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

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • MySQL未提交事务造成的等待事件怎么解决
    本篇内容主要讲解“MySQL未提交事务造成的等待事件怎么解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“MySQL未提交事务造成的等待事件怎么解决”吧! ...
    99+
    2024-04-02
  • 怎么解决MySQL元数据锁导致的会话等待
    本篇内容介绍了“怎么解决MySQL元数据锁导致的会话等待”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! ...
    99+
    2024-04-02
  • Mysql事物锁等待超时Lockwaittimeoutexceeded;的解决
    目录问题场景原因分析解决方案参考信息工作中同事遇到此异常,查找解决问题时,收集整理形成此篇文章。 问题场景 问题出现环境:1、在同一事务内先后对同一条数据进行插入和更新操作;2、多台...
    99+
    2024-04-02
  • MySQL 中行锁等待超时如何解决
    这篇文章给大家介绍MySQL 中行锁等待超时如何解决,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。 一、背景#### 20191219 10:10:10,...
    99+
    2024-04-02
  • 如何解决MySQL报错:锁等待超时
    当MySQL报错锁等待超时时,可以尝试以下解决方法:1. 优化查询语句和数据库结构:锁等待超时通常是由于查询语句执行时间过长或者数据...
    99+
    2023-10-12
    MySQL
  • 如何解决MySQL报错:事务等待超时
    MySQL报错“事务等待超时”通常是由于事务锁等待时间过长导致的。解决这个问题的方法有以下几种:1. 调整事务超时时间:在MySQL...
    99+
    2023-10-18
    MySQL
  • 如何解决MySQL报错:锁等待超时,尝试重新启动事务
    当MySQL报错锁等待超时并且建议尝试重新启动事务时,可以尝试以下方法解决问题:1. 确认是否存在长时间运行的事务:使用`SHOW ...
    99+
    2023-10-12
    MySQL
  • 解决plsql因事务未提交造成的锁表问题
    1、执行以下语句可查询被锁的表 select b.owner,b.object_name,a.session_id,a.locked_mode from v$l...
    99+
    2024-04-02
  • mysql中如何实现定位空闲会话事务没提交导致锁阻塞的脚本
    这篇文章主要为大家展示了“mysql中如何实现定位空闲会话事务没提交导致锁阻塞的脚本”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“mysql中如何实现定位空闲会...
    99+
    2024-04-02
  • Lock wait timeout exceeded - 如何解决MySQL报错:锁等待超时
    摘要:在使用MySQL数据库时,有时会遇到锁等待超时的问题。这个问题通常发生在多个事务同时尝试修改同一行数据时,其中一个事务会等待另一个事务的锁释放。本文将介绍如何解决MySQL报错中的锁等待超时问题,并提供具体的代码示例。一、什么是锁等待...
    99+
    2023-10-21
    MySQL 超时 锁等待
  • 怎么解决plsql因事务未提交造成的锁表问题
    本篇内容主要讲解“怎么解决plsql因事务未提交造成的锁表问题”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么解决plsql因事务未提交造成的锁表问题”吧!执行以下语句可查询被锁的表 ...
    99+
    2023-06-22
  • Lock wait timeout exceeded; try restarting transaction - 如何解决MySQL报错:事务等待超时
    在使用MySQL数据库时,有时可能会遇到一个常见的错误:Lock wait timeout exceeded; try restarting transaction,该错误表示事务等待超时。这个错误通常发生在并发访问数据库时,因为有一个事务...
    99+
    2023-10-21
    MySQL 事务 超时
  • 如何解决死锁(等待失败测试的信号)
    php小编小新为您介绍如何解决死锁问题。死锁是并发编程中常见的问题,当两个或多个进程互相等待对方释放资源时,会出现死锁现象。为了解决这个问题,我们可以采用一些常见的方法,如使用互斥锁、...
    99+
    2024-02-09
  • Lock wait timeout exceeded; try restarting transaction - 如何解决MySQL报错:锁等待超时,尝试重新启动事务
    正文:MySQL作为一种常用的关系型数据库管理系统,被广泛应用于各种类型的应用程序。然而,在使用MySQL时,我们可能会遇到各种错误和异常。其中一个常见的错误是“Lock wait timeout exceeded; try restart...
    99+
    2023-10-21
    MySQL 报错 锁等待超时
  • 如何理解mysql隐式提交事务transaction
    如何理解mysql隐式提交事务transaction,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。隐式提交事务概述  事务是一个完整...
    99+
    2024-04-02
  • 如何理解MySQL层事务提交流程
    如何理解MySQL层事务提交流程,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。部分栈帧:prepare栈帧(gdb) bt #0&n...
    99+
    2024-04-02
  • Spring TransactionalEventListener事务未提交读取不到数据的解决
    目录一、背景二、问题分析2.1、mysql隔离级别2.2、问题原因分析三、解决问题方案3.1、方式一3.2、方式二四、使用案例一、背景 业务处理过程,发现了以下问题,代码一是原代码能...
    99+
    2024-04-02
  • dns服务器未响应导致无法上网如何解决
    本篇内容介绍了“dns服务器未响应导致无法上网如何解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!解决方...
    99+
    2022-12-16
    dns服务器 服务器
  • 如何理解EF Core事务提交
    本篇内容主要讲解“如何理解EF Core事务提交”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何理解EF Core事务提交”吧!控制事务可以使用 DbCont...
    99+
    2024-04-02
  • SpringBoot + Redis如何解决重复提交问题(幂等)
    目录幂等:解决方案:一、搭建Redis服务二、自定义注解三、Token创建和校验四、拦截器配置五、正常Sevice类六、Controller类七、测试在开发中,一个对外暴露的接口可能...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作