首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
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 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
深入了解epoll模型 -- 开卷有益
上网一搜epoll,基本是这样的结果出来:《多路转接I/O – epoll模型》,万变不离这个标题。 但是呢,不变的事物,我们就更应该抓出其中的重点了。 多路、转接、I/O、模型。 别急,先记住这几个词,我比较喜欢你们看我文章的时候带着问题。
看、未来
2022/05/06
7940
深入了解epoll模型 -- 开卷有益
重新认识一下 epoll 的 ET 模式和 LT 模式吧?+ 源码验证 + 新疑惑
好像大家都在说 ET 要比 LT 快哈,曾经我也是这一派的。但是另一派的人有说,就连那些“古董级”人物都不敢说自己有把握用好 ET,然后结合我自己对 ET 和 LT 的理解和认知,在看到这个议题的时候,我还真有点犹豫。
看、未来
2021/10/13
1.1K2
epoll
io多路复用有很多种实现,自Linux 2.6内核正式引入epoll以来,epoll已经成为了目前实现高性能网络服务器端的必备技术。相比较select、poll而言,在查询、复制、监听数量上,epoll都有极大优势。
冰寒火
2023/03/07
9110
linux 内核poll/select/epoll实现剖析(经典)-下
epoll 的实现比poll/select 复杂一些,这是因为: 1. epoll_wait, epoll_ctl 的调用完全独立开来,内核需要锁机制对这些操作进行保护,并且需要持久的维护添加到epoll的文件 2. epoll本身也是文件,也可以被poll/select/epoll监视,这可能导致epoll之间循环唤醒的问题 3. 单个文件的状态改变可能唤醒过多监听在其上的epoll,产生唤醒风暴
用户8639654
2021/08/30
1.2K0
一文读懂 Linux epoll 实现原理
如下的代码中,先用 epoll_create 创建一个 epoll 文件描述符 epfd,再通过 epoll_ctl 将需要监听的 socket 添加到 epfd 中,最后调用 epoll_wait 等待数据。
恋喵大鲤鱼
2024/05/24
1.6K0
一文读懂 Linux epoll 实现原理
Linux Epoll 一网打尽
epoll同样是linux上的IO多路复用的一种实现,内核在实现时使用的数据结构相比select要复杂,但原理上并不复杂,我们力求在下面的描述里抽出主干,理清思路。
扫帚的影子
2019/11/20
1.8K0
理解epoll(上)(基于linux2.6.12.1)
epoll在现在的软件中占据了很大的分量,nginx,libuv等单线程事件循环的软件都使用了epoll。之前分析过select,今天分析一下epoll。
theanarkh
2020/04/01
1.2K0
理解epoll(上)(基于linux2.6.12.1)
深入浅出 Linux 惊群:现象、原因和解决方案
作者:morganhuang,腾讯 IEG 后台工程师 "惊群"简单地来讲,就是多个进程(线程)阻塞睡眠在某个系统调用上,在等待某个 fd(socket)的事件的到来。当这个 fd(socket)的事件发生的时候,这些睡眠的进程(线程)就会被同时唤醒,多个进程(线程)从阻塞的系统调用上返回,这就是"惊群"现象。"惊群"被人诟病的是效率低下,大量的 CPU 时间浪费在被唤醒发现无事可做,然后又继续睡眠的反复切换上。本文谈谈 linux socket 中的一些"惊群"现象、原因以及解决方案。 1. A
腾讯技术工程官方号
2021/07/06
3.3K0
彻底搞定select、poll、epoll
上一篇文章以近乎啰嗦的方式详细描述了BIO与非阻塞IO的各种细节。如果各位还没有读过这篇文章,强烈建议先阅读一下,然后再来看本篇,因为逻辑关系是层层递进的。
蝉沐风
2023/02/01
1.9K0
彻底搞定select、poll、epoll
linux 内核poll/select/epoll实现剖析(经典)-下
epoll 的实现比poll/select 复杂一些,这是因为: 1. epoll_wait, epoll_ctl 的调用完全独立开来,内核需要锁机制对这些操作进行保护,并且需要持久的维护添加到epoll的文件 2. epoll本身也是文件,也可以被poll/select/epoll监视,这可能导致epoll之间循环唤醒的问题 3. 单个文件的状态改变可能唤醒过多监听在其上的epoll,产生唤醒风暴
用户8639654
2021/08/27
1K0
深入分析select&poll&epoll原理
首先,我们要了解IO复用模型之前,先要了解在Linux内核中socket事件机制在内核底层是基于什么机制实现的,它是如何工作的,其次,当我们对socket事件机制有了一个基本认知之后,那么我们就需要思考到底什么是IO复用,基于socket事件机制的IO复用是怎么实现的,然后我们才来了解IO复用具体的实现技术,透过本质看select/poll/epoll的技术优化,逐渐去理解其中是为了解决什么问题而出现的,最后本文将围绕上述思维导图列出的知识点进行分享,还有就是文章幅度较长且需要思考,需要认真阅读!
小坤探游架构笔记
2020/03/11
1.1K0
从linux源码看epoll
在linux的高性能网络编程中,绕不开的就是epoll。和select、poll等系统调用相比,epoll在需要监视大量文件描述符并且其中只有少数活跃的时候,表现出无可比拟的优势。epoll能让内核记住所关注的描述符,并在对应的描述符事件就绪的时候,在epoll的就绪链表中添加这些就绪元素,并唤醒对应的epoll等待进程。 本文就是笔者在探究epoll源码过程中,对kernel将就绪描述符添加到epoll并唤醒对应进程的一次源码分析(基于linux-2.6.32内核版本)。由于篇幅所限,笔者聚焦于tcp协议下socket可读事件的源码分析。
无毁的湖光-Al
2019/03/12
5.5K0
从linux源码看epoll
深入分析select&poll&epoll原理
首先,我们要了解IO复用模型之前,先要了解在Linux内核中socket事件机制在内核底层是基于什么机制实现的,它是如何工作的,其次,当我们对socket事件机制有了一个基本认知之后,那么我们就需要思考到底什么是IO复用,基于socket事件机制的IO复用是怎么实现的,然后我们才来了解IO复用具体的实现技术,透过本质看select/poll/epoll的技术优化,逐渐去理解其中是为了解决什么问题而出现的,最后本文将围绕上述思维导图列出的知识点进行分享,还有就是文章幅度较长且需要思考,需要认真阅读!
小坤探游架构笔记
2020/03/10
3.3K0
图解 | 深入揭秘 epoll 是如何实现 IO 多路复用的!
进程在 Linux 上是一个开销不小的家伙,先不说创建,光是上下文切换一次就得几个微秒。所以为了高效地对海量用户提供服务,必须要让一个进程能同时处理很多个 tcp 连接才行。现在假设一个进程保持了 10000 条连接,那么如何发现哪条连接上有数据可读了、哪条连接可写了 ?
范蠡
2021/04/08
1.7K0
图解 | 深入揭秘 epoll 是如何实现 IO 多路复用的!
Epoll详解及源码分析
对于水平触发模式(LT):在1处,如果你不做任何操作,内核依旧会不断的通知进程文件描述符准备就绪。
bear_fish
2018/09/20
1.9K0
Epoll详解及源码分析
从内核看eventfd的实现(基于5.9.9)
前言:eventfd是一种进程/线程通信的机制,他类似信号,不过eventfd只是一种通知机制,无法承载数据(eventfd承载的数据是8个字节),他的好处是简单并且只消耗一个fd。
theanarkh
2021/07/08
8550
从内核看eventfd的实现(基于5.9.9)
Linux epoll 源码分析 2
继上一篇 Linux epoll 源码分析 1,我们来继续看下 epoll_ctl 方法。
KINGYT
2019/05/30
1.7K0
十个问题理解Linux epoll工作原理
作者:dustinzhou,腾讯 IEG 运营开发工程师 epoll 是 linux 特有的一个 I/O 事件通知机制。很久以来对 epoll 如何能够高效处理数以百万记的文件描述符很有兴趣。近期学习、研究了 epoll 源码,在这个过程中关于 epoll 数据结构和作者的实现思路产生出不少疑惑,在此总结为了 10 个问题并逐个加以解答和分析。本文基于的内核源码版本是2.6.39 版本 。 Question 1:是否所有的文件类型都可以被 epoll 监视? 答案:不是。看下面这个实验代码: #inc
腾讯技术工程官方号
2021/06/03
4.2K0
Epoll 如何工作的?
epoll 是Linux平台下的一种特有的多路复用IO实现方式,与传统的 select 相比,epoll 在性能上有很大的提升。本文主要讲解 epoll 的实现原理,而对于 epoll 的使用可以参考相关的书籍或文章。
用户7686797
2020/08/25
1K0
图解 | epoll怎么实现的
epoll 可以说是编写高性能服务端程序必不可少的技术,在介绍 epoll 之前,我们先来了解一下 多路复用I/O 吧。
用户7686797
2021/04/23
1.8K0
图解 | epoll怎么实现的
相关推荐
深入了解epoll模型 -- 开卷有益
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验