mysql发生死锁问题请求帮助

author author     2023-03-03     292

关键词:

这是我见的一个文档,虽然我看不懂,你看看有没有帮助
MySQL死锁问题的相关知识是本文我们主要要介绍的内容,接下来我们就来一一介绍这部分内容,希望能够对您有所帮助。
  1、MySQL常用存储引擎的锁机制
  MyISAM和MEMORY采用表级锁(table-level locking)
  BDB采用页面锁(page-level locking)或表级锁,默认为页面锁
  InnoDB支持行级锁(row-level locking)和表级锁,默认为行级锁
  2、各种锁特点
  表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低
  行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高
  页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般
  3、各种锁的适用场景
  表级锁更适合于以查询为主,只有少量按索引条件更新数据的应用,如Web应用
  行级锁则更适合于有大量按索引条件并发更新数据,同时又有并发查询的应用,如一些在线事务处理系统
  4、死锁
  是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。
  表级锁不会产生死锁。所以解决死锁主要还是针对于最常用的InnoDB。
  5、死锁举例分析
  在MySQL中,行级锁并不是直接锁记录,而是锁索引。索引分为主键索引和非主键索引两种,如果一条sql语句操作了主键索引,MySQL就会锁定这条主键索引;如果一条语句操作了非主键索引,MySQL会先锁定该非主键索引,再锁定相关的主键索引。
  在UPDATE、DELETE操作时,MySQL不仅锁定WHERE条件扫描过的所有索引记录,而且会锁定相邻的键值,即所谓的next-key locking。
  例如,一个表db。tab_test,结构如下:
  id:主键;
  state:状态;
  time:时间;
  索引:idx_1(state,time)
  出现死锁日志如下:
  ?***(1) TRANSACTION:
  ?TRANSACTION 0 677833455, ACTIVE 0 sec, process no 11393, OSthread 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 tab_test set state=1064,time=now() where state=1061 and time < date_sub(now(), INTERVAL 30 minute) (任务1的sql语句)
  ?***(1) WAITING FOR THIS LOCK TO BE GRANTED: (任务1等待的索引记录)
  ?RECORD LOCKS space id 0 page no 849384 n bits 208 index `PRIMARY` of table `db/tab_test` trx id 0 677833455 _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 tab_test set state=1067,time=now () where id in (9921180) (任务2的sql语句)
  ?*** (2) HOLDS THE LOCK(S): (任务2已获得的锁)
  ?RECORD LOCKS space id 0 page no 849384 n bits 208 index `PRIMARY` of table `db/tab_test` 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: (任务2等待的锁)
  ?RECORD LOCKS space id 0 page no 843102 n bits 600 index `idx_1` of table `db/tab_test` 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)
  ?(回滚了任务1,以解除死锁)
  原因分析:
  当“update tab_test set state=1064,time=now() where state=1061 and time < date_sub(now(), INTERVAL 30 minute)”执行时,MySQL会使用idx_1索引,因此首先锁定相关的索引记录,因为idx_1是非主键索引,为执行该语句,MySQL还会锁定主键索引。
  假设“update tab_test set state=1067,time=now () where id in (9921180)”几乎同时执行时,本语句首先锁定主键索引,由于需要更新state的值,所以还需要锁定idx_1的某些索引记录。
  这样第一条语句锁定了idx_1的记录,等待主键索引,而第二条语句则锁定了主键索引记录,而等待idx_1的记录,这样死锁就产生了。
  6、解决办法
  拆分第一条sql,先查出符合条件的主键值,再按照主键更新记录:
  ?select id from tab_test where state=1061 and time < date_sub(now(), INTERVAL 30 minute);
  ?update tab_test state=1064,time=now() where id in(......);
参考技术A 你可以先查出死锁id,然后将其kill掉。操作类似如下:

mysqladmin -uroot -p123456 processlist | grep -i Locked
mysqladmin -uroot -p123456 kill yourid

不过mysql死锁都是由业务逻辑引起,要想根除,肯定需要开发来处理的。

死锁前言

...近期在工作在遇到了几个和以前自己理解的一些不一样的死锁问题,因此想做一个mysql的死锁系列,梳理一下mysql引发死锁的一些场景,由于个人认知终归有限,本文所列的死锁场景不代表mysql全部的死锁触发原因,希望给其他同... 查看详情

死锁问题

...就餐问题:当5个进程的时候如果都同时申请到了1台,就发生死锁了。如果是4个进程,那必然有一个能申请到2台。 虽然进程在运行过程中,可能发生死锁,但死锁的发生也必须具备一定的条件,死锁的发生必须具备以下四... 查看详情

如何解决mysql中的死锁问题?

...1a;大数据DT(ID:hzdashuju)01死锁的产生和预防发生死锁的必要条件有4个,分别为互斥条件、不可剥夺条件、请求与保持条件和循环等待条件, 查看详情

如何解决mysql中的死锁问题?

...1a;大数据DT(ID:hzdashuju)01死锁的产生和预防发生死锁的必要条件有4个,分别为互斥条件、不可剥夺条件、请求与保持条件和循环等待条件, 查看详情

需要死锁帮助

...决问题我认为您对问题的描述过于抽象。您如何检测就地发生的死锁 查看详情

mysql存储过程出现死锁

...等待资源关系。这四个条件是死锁的必要条件,只要系统发生死锁,这些条件必然成立,而只要上述条件之一不满足,就不会发生死锁。参考技术A可以在存储过程中,使用锁机制避免死锁问题。可以在MySQL核心技术与最佳实践中... 查看详情

如何解决mysql中的死锁问题?(代码片段)

...成死锁。本文介绍死锁的产生及处理。死锁的产生和预防发生死锁的必要条件有4个,分别为互斥条件、不可剥夺条件、请求与保持条件和循环等待条件,如下图所示:互斥条件在一段时间内,计算机中的某个资源... 查看详情

使用多线程代码在一张表上发生 MySQL 死锁

】使用多线程代码在一张表上发生MySQL死锁【英文标题】:MySQLdeadlockononetablewithmultithreadingcode【发布时间】:2016-03-1622:46:45【问题描述】:我创建了一个收集价格并将其存储在数据库中的应用程序。该应用程序使用两个线程运行... 查看详情

请教一个mysql中死锁的问题

... ”因为客户端A需要一个X锁定来删除该行,所以在这里发生死锁。尽管如此,锁定请求不被允许,因为客户端B已经有一个对X锁定的请求并且它正等待客户端A释放S锁定。因为客户端B之前对X锁定的请求,被客户端A持有的S锁定... 查看详情

手把手教你分析mysql死锁问题

...了一个死锁问题,所以有了这篇图文详细的博文,哈哈~发生死锁了,如何排查和解决呢?本文将跟你一起探讨这个问题准备好数据环境模拟死锁案发分析死锁日志分析死锁结果环境准备数据库隔离级别:​​mysql>select@@tx_isolat... 查看详情

为啥 SQL Server 会发生死锁?

】为啥SQLServer会发生死锁?【英文标题】:WhydodeadlockshappeninSQLServer?为什么SQLServer会发生死锁?【发布时间】:2011-07-2119:10:21【问题描述】:据我了解,SQL死锁发生在SPID忙于处理另一个查询并且因为它现在很忙而无法运行另一个... 查看详情

将共享锁升级为独占锁时避免 MySQL 死锁

...问题描述】:我使用的是MySQL5.5。我注意到在并发场景中发生了一个特殊的死锁,我认为这种死锁不应该发生。像这样重现,使用同时运行的两个mysql客户端会话:mysql会话1:createtableparent(idin 查看详情

记一次数据库死锁(代码片段)

...ckException:Deadlockfoundwhentryingtogetlock;tryrestartingtransaction死锁发生在一个事务中,事务对多个表进行了操作。在报错日志中,死锁发生在tableA与tableB。一开始怀疑此次发布的某个改动中对上面这两张表新增了select或update操作。将注意... 查看详情

在 MySQL 中遇到死锁

...了MySQL中的死锁。这不是因为超过锁定超时,因为死锁在发生时会立即发生。下面是在2个独立线程(与连接池中的2个独立连接)上执行的SQL代码,它会产生死锁:UPDATESequencesSETCounter=LAST_INSERT_ID(Counter+1)WHERESeq 查看详情

mysql更新死锁问题

作为一个社交类的App,我们有很多操作都会同时发生,为了确保数据的一致性,会采用数据库的事物。比如现在我们有一个点赞操作,点赞成功后,需要更改文章的热度。以下是SQL语句:INSERTINTOuser_praise(uid,plan_id,stage_id)VALUES(123456... 查看详情

JPA 2.0 如何处理死锁(Eclipselink JPA2.0 MySQL)

...k提供程序和JPA2.0。和MySQL。下面的代码抛出一个错误,说发生了死锁。这个问题是随机发生的。我想知道如何处理死锁。这是错误 查看详情

用sql语句,怎么解决mysql数据库死锁

... 表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低  行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高  页面锁:开销和加锁时间界于表... 查看详情

阿里二面:怎么解决mysql死锁问题的?(代码片段)

咱们使用MySQL大概率上都会遇到死锁问题,这实在是个令人非常头痛的问题。本文将会对死锁进行相应介绍,对常见的死锁案例进行相关分析与探讨,以及如何去尽可能避免死锁给出一些建议。话不多说,开整ÿ... 查看详情