搜索
首页数据库mysql教程巧用MySQL InnoDB引擎锁机制解决死锁问题_MySQL

案例如下:

在使用Show innodb status检查引擎状态时,发现了死锁问题:

*** (1) TRANSACTION:

TRANSACTION 0 677833455, ACTIVE 0 sec, process no 11393, OS thread id 278546 starting index read

mysql tables in use 1, locked 1

LOCK WAIT 3 lock struct(s), heap size 320

MySQL thread id 83, query id 162348740 dcnet03 dcnet Searching rows for update

update TSK_TASK set STATUS_ID=1064,UPDATE_TIME=now () where STATUS_ID=1061 and MON_TIME*** (1) WAITING FOR THIS LOCK TO BE GRANTED:

RECORD LOCKS space id 0 page no 849384 n bits 208 index `PRIMARY` of table `dcnet_db/TSK_TASK` trx id 0 677833455 lock_mode X locks rec but not gap waiting

Record lock, heap no 92 PHYSICAL RECORD: n_fields 11; compact format; info bits 0

0: len 8; hex 800000000097629c; asc b ;; 1: len 6; hex 00002866eaee; asc (f ;; 2: len 7; hex 00000d40040110; asc @ ;; 3: len 8; hex 80000000000050b2; asc P ;; 4: len 8; hex 800000000000502a; asc P*;; 5: len 8; hex 8000000000005426; asc T&;; 6: len 8; hex 800012412c66d29c; asc A,f ;; 7: len 23; hex 75706c6f6164666972652e636f6d2f6 8616e642e706870; asc xxx.com/;; 8: len 8; hex 800000000000042b; asc +;; 9: len 4; hex 474bfa2b; asc GK +;; 10: len 8; hex 8000000000004e24; asc N$;;


*** (2) TRANSACTION:

TRANSACTION 0 677833454, ACTIVE 0 sec, process no 11397, OS thread id 344086 updating or deleting, thread declared inside InnoDB 499

mysql tables in use 1, locked 1

3 lock struct(s), heap size 320, undo log entries 1

MySQL thread id 84, query id 162348739 dcnet03 dcnet Updating

update TSK_TASK set STATUS_ID=1067,UPDATE_TIME=now () where ID in (9921180)

*** (2) HOLDS THE LOCK(S):

RECORD LOCKS space id 0 page no 849384 n bits 208 index `PRIMARY` of table `dcnet_db/TSK_TASK` trx id 0 677833454 lock_mode X locks rec but not gap

Record lock, heap no 92 PHYSICAL RECORD: n_fields 11; compact format; info bits 0

0: len 8; hex 800000000097629c; asc b ;; 1: len 6; hex 00002866eaee; asc (f ;; 2: len 7; hex 00000d40040110; asc @ ;; 3: len 8; hex 80000000000050b2; asc P ;; 4: len 8; hex 800000000000502a; asc P*;; 5: len 8; hex 8000000000005426; asc T&;; 6: len 8; hex 800012412c66d29c; asc A,f ;; 7: len 23; hex 75706c6f6164666972652e636f6d2f6 8616e642e706870; asc uploadfire.com/hand.php;; 8: len 8; hex 800000000000042b; asc +;; 9: len 4; hex 474bfa2b; asc GK +;; 10: len 8; hex 8000000000004e24; asc N$;;


*** (2) WAITING FOR THIS LOCK TO BE GRANTED:

RECORD LOCKS space id 0 page no 843102 n bits 600 index `KEY_TSKTASK_MONTIME2` of table `dcnet_db/TSK_TASK` trx id 0 677833454 lock_mode X locks rec but not gap waiting

Record lock, heap no 395 PHYSICAL RECORD: n_fields 3; compact format; info bits 0

0: len 8; hex 8000000000000425; asc %;; 1: len 8; hex 800012412c66d29c; asc A,f ;; 2: len 8; hex 800000000097629c; asc b ;;


*** WE ROLL BACK TRANSACTION (1)


此死锁问题涉及TSK_TASK表,该表用于保存系统监测任务,以下是相关字段及索引:

 

ID:主键;


MON_TIME:监测时间;


STATUS_ID:任务状态;


索引:KEY_TSKTASK_MONTIME2 (STATUS_ID, MON_TIME)。

 

 

分析,涉及的两条语句应该不会涉及相同的TSK_TASK记录,那为什么会造成死锁呢?


查询MySQL官网文档,发现这跟MySQL的索引机制有关。MySQL的InnoDB引擎是行级锁,我原来的理解是直接对记录进行锁定,实际上并不是这样的。

要点如下:


不是对记录进行锁定,而是对索引进行锁定;


在UPDATE、DELETE操作时,MySQL不仅锁定WHERE条件扫描过的所有索引记录,而且会锁定相邻的键值,即所谓的next-key locking;

如语句UPDATE TSK_TASK SET UPDATE_TIME = NOW() WHERE ID > 10000会锁定所有主键大于等于1000的所有记录,在该语句完成之前,你就不能对主键等于10000的记录进行操作;


当非簇索引(non-cluster index)记录被锁定时,相关的簇索引(cluster index)记录也需要被锁定才能完成相应的操作。


再分析一下发生问题的两条SQL语句,就不难找到问题所在了:


当“update TSK_TASK set STATUS_ID=1064,UPDATE_TIME=now () where STATUS_ID=1061 and MON_TIME

假设“update TSK_TASK set STATUS_ID=1067,UPDATE_TIME=now () where ID in (9921180)”几乎同时执行时,本语句首先锁定簇索引(主键),由于需要更新STATUS_ID的值,所以还需要锁定KEY_TSKTASK_MONTIME2的某些索引记录。


这样第一条语句锁定了KEY_TSKTASK_MONTIME2的记录,等待主键索引,而第二条语句则锁定了主键索引记录,而等待KEY_TSKTASK_MONTIME2的记录,在此情况下,死锁就产生了。


笔者通过拆分第一条语句解决死锁问题:

先查出符合条件的ID:select ID from TSK_TASK where STATUS_ID=1061 and MON_TIME

至此,死锁问题彻底解决

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
苹果有锁和无锁的区别是什么 详细介绍:iphone有锁和无锁的区别对比苹果有锁和无锁的区别是什么 详细介绍:iphone有锁和无锁的区别对比Mar 28, 2024 pm 03:10 PM

苹果手机是近来大家选择最广泛的一款手机,但我们经常会在网上看到大家在讨论苹果手机有锁与无锁的区别,会纠结于要购买哪一种。今天陈斯琪就给大家普及一下iphone有锁和无锁的区别,为大家排忧解难。其实二者在外观、功能上并没有太大差别,关键就在价格以及使用上的一些问题。什么是有锁版与无锁版没有锁版限制的苹果手机指不受运营商的限制,任何一家运营商的SIM卡都可以正常使用。有锁版是指加了网络锁,只能使用指定的运营商提供的SIM卡,不能使用其他的。其实没有锁版的苹果手机就像我们的全网通手机一样可以使用移动、

如何使用Oracle 查询表是否被锁?如何使用Oracle 查询表是否被锁?Mar 06, 2024 am 11:54 AM

标题:如何使用Oracle查询表是否被锁?在Oracle数据库中,表锁是指当一个事务正在对表执行写操作时,其他事务想要对该表执行写操作或者对表进行结构改变(如增加列、删除行等)时会被阻塞。在实际开发过程中,我们经常需要查询表是否被锁,以便更好地排查和处理相关问题。本文将介绍如何使用Oracle语句查询表是否被锁,并给出具体的代码示例。要查询表是否被锁,我们

Python GIL(全局解释器锁):揭秘背后的原理和性能影响Python GIL(全局解释器锁):揭秘背后的原理和性能影响Feb 27, 2024 am 09:00 AM

pythonGIL(全局解释器锁)是Python中一个重要的机制,它限制了同一时刻只能有一个线程执行Python字节码。这主要是为了确保Python解释器的稳定性,因为Python的内存管理和垃圾回收机制都是单线程的。如果允许多个线程同时执行Python字节码,就有可能导致内存损坏或其他不可预知的错误。GIL的原理比较简单。它是一个由Python解释器维护的锁,当一个线程执行Python字节码时,它会获取GIL。其他线程如果想要执行Python字节码,必须等待GIL被释放。当GIL被释放后,其他

golang函数中的锁是如何实现的?golang函数中的锁是如何实现的?Jun 05, 2024 pm 12:39 PM

Go语言中的锁实现同步并发代码,防止数据竞争:Mutex:互斥锁,保证同一时间只有一个goroutine获取锁,用于临界区控制。RWMutex:读写锁,允许多个goroutine同时读取数据,但仅一个goroutine同时写入数据,适用于需要频繁读写共享数据的场景。

win11改win10系统教程的详细介绍win11改win10系统教程的详细介绍Jul 08, 2023 pm 09:21 PM

微软6月24号正式公布了win11系统,可以看到用户界面、开始菜单等和Windows10X中发现的非常相似。有的朋友在使用预览版的时候发现用的不习惯,想要改win10系统开使用,那么我们要如何操作呢,下面我们就来看看win11改win10系统教程,一起来学习一下吧。1、第一步是从Windows11打开新设置。在这里,您需要转到图像中显示的系统设置。2、在系统设置下,选择“恢复”选项。在这里,您将能够看到“以前版本的窗口”选项。您还可以在它旁边看到一个“返回”按钮,单击此按钮。3、您可以指定要返回

PHP中如何使用PHP-CS-Fixer进行代码风格检查PHP中如何使用PHP-CS-Fixer进行代码风格检查Jun 27, 2023 pm 01:27 PM

在开发过程中,良好的代码风格是提高代码质量和可读性的重要因素。而PHP作为当今市场上应用最广泛的编程语言之一,其代码风格检查也显得尤为重要。在这里,我们将介绍一种PHP代码风格检查工具——PHP-CS-Fixer,并详细讲解如何在其上进行代码风格检查。首先,我们需要了解PHP-CS-Fixer是什么。PHP-CS-Fixer是一个由Symfony框架创建的P

Redis实现分布式锁的性能对比Redis实现分布式锁的性能对比Jun 20, 2023 pm 05:46 PM

随着互联网应用的规模越来越大,分布式系统也越来越常见。在这些系统中,分布式锁是一项必不可少的功能。由于分布式锁需求旺盛,因此存在着各种各样的实现方式。其中,Redis是一种流行的,在分布式锁实现中被广泛应用的工具。在本文中,我们将探讨Redis实现分布式锁的性能对比。一、Redis基础概念在讨论Redis的分布式锁性能之前,我们需要了解一些Redis的基础概

Python 并发编程中的锁与同步:保持你的代码安全可靠Python 并发编程中的锁与同步:保持你的代码安全可靠Feb 19, 2024 pm 02:30 PM

并发编程中的锁与同步在并发编程中,多个进程或线程同时运行,这可能会导致资源争用和不一致性问题。为了解决这些问题,需要使用锁和同步机制来协调对共享资源的访问。锁的概念锁是一种机制,它允许一次只有一个线程或进程访问共享资源。当一个线程或进程获得锁时,其他线程或进程将被阻止访问该资源,直到锁被释放。锁的类型python中有几种类型的锁:互斥锁(Mutex):确保一次只有一个线程或进程可以访问资源。条件变量:允许线程或进程等待某个条件,然后获取锁。读写锁:允许多个线程同时读取资源,但只允许一个线程写入资

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前By尊渡假赌尊渡假赌尊渡假赌

热工具

螳螂BT

螳螂BT

Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一个PHP/MySQL的Web应用程序,非常容易受到攻击。它的主要目标是成为安全专业人员在合法环境中测试自己的技能和工具的辅助工具,帮助Web开发人员更好地理解保护Web应用程序的过程,并帮助教师/学生在课堂环境中教授/学习Web应用程序安全。DVWA的目标是通过简单直接的界面练习一些最常见的Web漏洞,难度各不相同。请注意,该软件中

EditPlus 中文破解版

EditPlus 中文破解版

体积小,语法高亮,不支持代码提示功能

安全考试浏览器

安全考试浏览器

Safe Exam Browser是一个安全的浏览器环境,用于安全地进行在线考试。该软件将任何计算机变成一个安全的工作站。它控制对任何实用工具的访问,并防止学生使用未经授权的资源。

Atom编辑器mac版下载

Atom编辑器mac版下载

最流行的的开源编辑器