Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >mysql 事务长时间占有锁

mysql 事务长时间占有锁

原创
作者头像
发布于 2020-12-20 09:20:13
发布于 2020-12-20 09:20:13
1.4K00
代码可运行
举报
文章被收录于专栏:peiyuanpeiyuan
运行总次数:0
代码可运行

问题:

业务代码日志出现lock timeout的报错,并且配置核查也会报读不到数据的错,具体的表现是:

1. 业务代码进行where的查询操作会导致lock timeout,从show engine innodb status查看有一个transaction已经存在了很长时,并且获取了很多锁

2. 从业务的log里看插入数据成功,但是后面在另一个线程里读不到数据,从Mysql命令行也读不到

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
MySQL [performance_schema]> show engine innodb status;

---TRANSACTION 2359367371, ACTIVE 2435 sec
26 lock struct(s), heap size 2936, 261 row lock(s), undo log entries 356
MySQL thread id 36811994, OS thread handle 0x7f99ea1c8700, query id 11140778723 16.2.7.21 root
Trx read view will not see trx with id >= 2359367372, sees < 2359367372

MySQL [performance_schema]> SHOW FULL PROCESSLIST ;
+----------+------+-------------------+------------------------+---------+------+-------+-----------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----------+------+-------------------+------------------------+---------+------+-------+-----------------------+
| 36811994 | root | 16.2.7.21:38938 | xxxxxxxxxxx | Sleep | 587 | | NULL |
+----------+------+-------------------+------------------------+---------+------+-------+-----------------------+

MySQL [information_schema]> select * from information_schema.INNODB_TRX where trx_id = '2359367371';
+------------+-----------+---------------------+-----------------------+------------------+------------+---------------------+-----------+---------------------+-------------------+-------------------+------------------+-----------------------+-----------------+-------------------+-------------------------+---------------------+-------------------+------------------------+----------------------------+---------------------------+---------------------------+------------------+----------------------------+
| trx_id | trx_state | trx_started | trx_requested_lock_id | trx_wait_started | trx_weight | trx_mysql_thread_id | trx_query | trx_operation_state | trx_tables_in_use | trx_tables_locked | trx_lock_structs | trx_lock_memory_bytes | trx_rows_locked | trx_rows_modified | trx_concurrency_tickets | trx_isolation_level | trx_unique_checks | trx_foreign_key_checks | trx_last_foreign_key_error | trx_adaptive_hash_latched | trx_adaptive_hash_timeout | trx_is_read_only | trx_autocommit_non_locking |
+------------+-----------+---------------------+-----------------------+------------------+------------+---------------------+-----------+---------------------+-------------------+-------------------+------------------+-----------------------+-----------------+-------------------+-------------------------+---------------------+-------------------+------------------------+----------------------------+---------------------------+---------------------------+------------------+----------------------------+
| 2359367371 | RUNNING | 2020-08-31 14:00:49 | NULL | NULL | 406 | 36811994 | NULL | NULL | 0 | 0 | 26 | 2936 | 265 | 380 | 0 | REPEATABLE READ | 1 | 1 | NULL | 0 | 9972 | 0 | 0 |
+------------+-----------+---------------------+-----------------------+------------------+------------+---------------------+-----------+---------------------+-------------------+-------------------+------------------+-----------------------+-----------------+-------------------+-------------------------+---------------------+-------------------+------------------------+----------------------------+---------------------------+---------------------------+------------------+----------------------------+

问题的定位:

定位发现是有业务获取了事务锁,同时关闭autocommit,此时业务出现异常退出,没有commit和rollback,导致transaction没有关闭.

问题的原因:

1. 因为mysql默认的isolation level是REPEATABLE-READ,由于事务一直没有提交,所以这个事务里的所有修改,其他线程都看不到

2. 这个事务会一直持有锁不释放,会导致其他线程在操作对应数据时出现lock wait timeout

解决方法:

  1. 尽可能使用autocommit,不要单独管理
  2. 如果确实有transction需求,那么代码需要补货异常,并执行commit或者rollback

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
查看Mysql正在执行的事务、锁、等待
EXPLAIN命令,用于显示SQL语句的查询执行计划。EXPLAIN为用于SELECT语句中的每个表返回一行信息。
wuweixiang
2019/03/12
17.8K0
Mysql一分钟定位 Next-Key Lock,你需要几分钟
查看线程模型 show variables like 'thread_handling'
王清培
2020/01/27
4240
MySQL锁等待与死锁问题分析
在 MySQL 运维过程中,锁等待和死锁问题是令各位 DBA 及开发同学非常头痛的事。出现此类问题会造成业务回滚、卡顿等故障,特别是业务繁忙的系统,出现死锁问题后影响会更严重。本篇文章我们一起来学习下什么是锁等待及死锁,出现此类问题又应该如何分析处理呢?
MySQL技术
2021/04/13
2.2K3
MySQL 锁机制和事务
InnoDB存储引擎支持行级锁 其大类可以细分为共享锁和排它锁两类 共享锁(S):允许拥有共享锁的事务读取该行数据。当一个事务拥有一行的共享锁时,另外的事务可以在同一行数据也获得共享锁,但另外的事务无法获得同一行数据上的排他锁
星哥玩云
2022/08/17
8730
MySQL 锁机制和事务
确定当前事务的隔离级别
事务是MySQL的Innodb存储引擎比较大的亮点,大家对事务的隔离级别肯定都不陌生,那么如何查看当前事务的隔离级别呢?这个方法可能大家也知道,不就是查看当前的transaction_isolation变量么?下面我们分三个部分给说说这个修改隔离级别的操作:
AsiaYe
2019/11/06
7070
MySQL 事务没有提交导致 锁等待 Lock wait timeout exceeded
Lock wait timeout exceeded 当一个SQL执行完了,但未COMMIT,后面的SQL想要执行就是被锁,超时结束; select * from information_schema.innodb_trx 之后找到了一个一直没有提交的只读事务, kill 到了对应的线程后ok 了。 mysql> select * from information_schema.innodb_trx; +--------+-----------+---------------------+
汤高
2018/03/28
1.8K0
MySQL的insert会阻塞update?
某银行客户在从Oracle迁移到MySQL的开发中,MySQL在READ-COMMITTED隔离级别下,出现了insert阻塞update的情况,但同样的情况下,Oracle的insert则不会阻塞update。本文通过复现该问题,分析MySQL的锁信息,确认是MySQL与Oracle在并发事务处理上的差异,在进行数据库迁移改造的程序开发应予以关注。
bisal
2023/04/06
2.1K0
Duplicate Key引发的死锁
在事务1执行INSERT INTO user VALUES(null, 'tenmao', 3);失败后,执行事务2,事务2等待后,再继续执行事务1,触发死锁。
十毛
2019/12/19
7620
Mysql 数据库 超时和锁定
昨天项目中遇到部分服务一直是pending状态,排查了代码和重启了服务都没能解决问题,于是从数据库开始排查。
chuchur
2022/10/25
5.3K0
MySQL找出未提交事务的信息
我们经常会碰到这样的情况,某个事务执行完了未提交,后续再来一个DDL和DML操作,导致后面的session要么处于waiting for metadata lock,要么是锁等待超时。这时我们往往只能找到这个未提交的事务的事务id和session id,但是一般都处于sleep状态,不好分析事务内容到底是什么,所以通常都是粗鲁地kill这个session后解决问题,但是应用层的研发人员往往找不到到底是哪个事务引起的,后面再出现问题时还要重复kill。
用户1148526
2020/03/31
5.3K0
记一次关于MySQL与PHP的蠢事
一个稍微有些小复杂的事务。首先需要初始化一些记录的值,然后选取一些新的记录,对新的记录进行排序,然后再将排序等信息写入。
lpe234
2020/07/27
4760
MySQL的innoDB锁机制以及死锁处理
InnoDB与MyISAM的最大不同有两点:一是支持事务(TRANSACTION);二是采用了行级锁。行级锁与表级锁本来就有许多不同之处,innodb正常的select ID from table where id=1;不会上任何锁,接下来详细讨论InnoDB的锁问题;
星哥玩云
2022/08/16
1K0
MySQL的innoDB锁机制以及死锁处理
MySQL 5.7 线程阻塞处理
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
星哥玩云
2022/08/16
6650
故障分析 | BenchmarkSQL 对 MySQL 测试时请注意隔离级别!
作者:李彬,爱可生 DBA 团队成员,负责项目日常问题处理及公司平台问题排查。爱好有亿点点多,吉他、旅行、打游戏
爱可生开源社区
2024/09/14
1430
故障分析 | BenchmarkSQL 对 MySQL 测试时请注意隔离级别!
关于mysql的事务,这些你都了解了么?
这篇博文源于公司一个批处理的项目异常而起的。先简单描述下发生背景。一个基于spring batch开发的批处理应用,线上运行了9个多月后,某一天突然跑批任务失败了,检查日志得知,是因为一个mysql异常导致的:Lock wait timeout exceeded。msyql事务锁等待超时这个异常虽然不常见,但随便一搜就会看到大量的相关的信息。导致这个异常的原因就是mysql数据库事务锁等待超时,默认超时时间是50S。但我们的批处理业务从逻辑上讲不会出现这种事务排他锁等待的情况,不得其解。故通过以下这些实例来捋一捋mysql事务内隔离级别和锁等知识点,看看是否如我们了解的这样,同时加深下印象。
kl博主
2023/11/18
2940
MySQL 5.6中如何定位DDL被阻塞的问题
在上一篇文章《MySQL 5.7中如何定位DDL被阻塞的问题》中,对于DDL被阻塞问题的定位,我们主要是基于MySQL 5.7新引入的performance_schema.metadata_locks表。提出的定位方法,颇有种"锦上添花"的意味,而且,也只适用于MySQL 5.7开始的版本。
星哥玩云
2022/08/17
4880
mysql innodb_trx参数详解
1、innodb_trx表提供了当前innodb引擎内每个事务的信息(只读事务除外),包括当一个事务启动,事务是否在等待一个锁,以及交易正在执行的语句(如果有的话)。查询语句:
用户14527
2022/03/24
4.3K0
DBBrain最佳实践:未提交事务的处理与应对
DBBrain 上经常会有用户来咨询“未提交事务”的事件会有什么问题,该如何处理等。其实这个问题的影响属于可大可小,所以正好来专门分析一下,避免因为轻视了这个问题导致严重的业务故障。
王文安@DBA
2022/03/03
2.9K2
DBBrain最佳实践:未提交事务的处理与应对
MySQL 到底能不能online ddl index PG VS MYSQL
上周一篇关于MySQL 拜托加个索引能和PG一样简单吗?只能gh-ost了 烦人,的帖子引起争议,主要因为我提到 POSTGRESQL 在线添加索引是非常方便的,MySQL 在这方面不咋地,首先说结果,我对MYSQL的知识需要更新,针对高版本得MYSQL是支持online ddl index,所以写这篇来纠正一下,但是有一些同学发了一些MYSQL 支持online ddl index 的绝对论甚至有人说mysql 5.x就可以onine ddl index,这点咱们也的纠正,对就是对,错就是错。
AustinDatabases
2024/06/05
2430
MySQL  到底能不能online ddl index    PG VS MYSQL
MySQL SQL更新锁定
版权声明:本文为博主原创文章,欢迎扩散,扩散请务必注明出处。
Leshami
2018/12/19
2.8K0
相关推荐
查看Mysql正在执行的事务、锁、等待
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档