我的编程空间,编程开发者的网络收藏夹
学习永远不晚

如何理解MYSQL RC模式insert update可能死锁的情况

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

如何理解MYSQL RC模式insert update可能死锁的情况

本篇文章给大家分享的是有关如何理解MYSQL RC模式insert update可能死锁的情况,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

涉及的语句为
RC模式下
update根据主键更新和insert
其实这样的问题在RC模式下,要么是简单update问题,要么是insert造成的主键和唯一键检查唯一性时出现问题。
下面以主键问题为列子进行分析一下可能出现的情况。

update  where条件更新为主键,锁结构出现在单行主键上,辅助索引包含隐含锁结构,当前读RC非唯一索引模式没有GAP锁,
insert  插入印象锁,主键和辅助索引上会出现隐含锁结构,

但是在RC模式下没有GAP所以插入印象锁一般不会成为问题


表结构:
+---------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table   | Create Table                                                                                                                                                                      |
+---------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| testlll | CREATE TABLE `testlll` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=24 DEFAULT CHARSET=latin1 |
+---------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+


情况1
insert
update


TX1:                                                                  TX2:
insert into testlll(name) values('gaopeng');
                                                                          insert into testlll(name) values('gaopeng');
update testlll set name='gaopeng1' where id=25;(堵塞)
                                                                           update testlll set name='gaopeng1' where id=24;(堵塞)
                                               
死锁

锁结构:

点击(此处)折叠或打开

  1. ---TRANSACTION 322809, ACTIVE 30 sec starting index read

  2. mysql tables in use 1, locked 1

  3. 3 lock struct(s), heap size 1160, 2 row lock(s), undo log entries 1

  4. MySQL thread id 3, OS thread handle 140734663714560, query id 409 localhost root updating

  5. update testlll set name='gaopeng1' where id=24

  6. ---lock strcut(1):(Add by gaopeng) In modify Version I force check all REC_LOCK/TAB_LOCK for this Trx

  7. TABLE LOCK table `test`.`testlll` trx id 322809 lock mode IX

  8. ---lock strcut(2):(Add by gaopeng) In modify Version I force check all REC_LOCK/TAB_LOCK for this Trx

  9. RECORD LOCKS space id 434 page no 3 n bits 96 index PRIMARY of table `test`.`testlll` trx id 322809 lock_mode X(LOCK_X) locks rec but not gap(LOCK_REC_NOT_GAP)

  10. Record lock, heap no 25 PHYSICAL RECORD: n_fields 4; compact format; info bits 0

  11.  0: len 4; hex 80000019; asc ;;

  12.  1: len 6; hex 00000004ecf9; asc ;;

  13.  2: len 7; hex f0000001f90110; asc ;;

  14.  3: len 7; hex 67616f70656e67; asc gaopeng;;


  15. ---lock strcut(3):(Add by gaopeng) In modify Version I force check all REC_LOCK/TAB_LOCK for this Trx

  16. RECORD LOCKS space id 434 page no 3 n bits 96 index PRIMARY of table `test`.`testlll` trx id 322809 lock_mode X(LOCK_X) locks rec but not gap(LOCK_REC_NOT_GAP) waiting(LOCK_WAIT)

  17. Record lock, heap no 20 PHYSICAL RECORD: n_fields 4; compact format; info bits 0

  18.  0: len 4; hex 80000018; asc ;;

  19.  1: len 6; hex 00000004ecf8; asc ;;

  20.  2: len 7; hex ef000001f80110; asc ;;

  21.  3: len 7; hex 67616f70656e67; asc gaopeng;;


  22. ---TRANSACTION 322808, ACTIVE 43 sec starting index read

  23. mysql tables in use 1, locked 1

  24. LOCK WAIT 3 lock struct(s), heap size 1160, 2 row lock(s), undo log entries 1

  25. MySQL thread id 2, OS thread handle 140734663980800, query id 408 localhost root updating

  26. update testlll set name='gaopeng1' where id=25

  27. ------- TRX HAS BEEN WAITING 5 SEC FOR THIS LOCK TO BE GRANTED:

  28. RECORD LOCKS space id 434 page no 3 n bits 96 index PRIMARY of table `test`.`testlll` trx id 322808 lock_mode X(LOCK_X) locks rec but not gap(LOCK_REC_NOT_GAP) waiting(LOCK_WAIT)

  29. Record lock, heap no 25 PHYSICAL RECORD: n_fields 4; compact format; info bits 0

  30.  0: len 4; hex 80000019; asc ;;

  31.  1: len 6; hex 00000004ecf9; asc ;;

  32.  2: len 7; hex f0000001f90110; asc ;;

  33.  3: len 7; hex 67616f70656e67; asc gaopeng;;


    ------------------

  34. ---lock strcut(1):(Add by gaopeng) In modify Version I force check all REC_LOCK/TAB_LOCK for this Trx

  35. TABLE LOCK table `test`.`testlll` trx id 322808 lock mode IX

  36. ---lock strcut(2):(Add by gaopeng) In modify Version I force check all REC_LOCK/TAB_LOCK for this Trx

  37. RECORD LOCKS space id 434 page no 3 n bits 96 index PRIMARY of table `test`.`testlll` trx id 322808 lock_mode X(LOCK_X) locks rec but not gap(LOCK_REC_NOT_GAP) waiting(LOCK_WAIT)

  38. Record lock, heap no 25 PHYSICAL RECORD: n_fields 4; compact format; info bits 0

  39.  0: len 4; hex 80000019; asc ;;

  40.  1: len 6; hex 00000004ecf9; asc ;;

  41.  2: len 7; hex f0000001f90110; asc ;;

  42.  3: len 7; hex 67616f70656e67; asc gaopeng;;


  43. ---lock strcut(3):(Add by gaopeng) In modify Version I force check all REC_LOCK/TAB_LOCK for this Trx

  44. RECORD LOCKS space id 434 page no 3 n bits 96 index PRIMARY of table `test`.`testlll` trx id 322808 lock_mode X(LOCK_X) locks rec but not gap(LOCK_REC_NOT_GAP)

  45. Record lock, heap no 20 PHYSICAL RECORD: n_fields 4; compact format; info bits 0

  46.  0: len 4; hex 80000018; asc ;;

  47.  1: len 6; hex 00000004ecf8; asc ;;

  48.  2: len 7; hex ef000001f80110; asc ;;

  49.  3: len 7; hex 67616f70656e67; asc gaopeng;;

情况2
update
update

TX1:                                                                    TX2:
update testlll set name='gaopeng1' where id=22;
                                                                            update testlll set name='gaopeng1' where id=25;
update testlll set name='gaopeng1' where id=25;(堵塞)
                                                                             update testlll set name='gaopeng1' where id=22;(堵塞)
死锁


这种情况比较简单不打印出锁结构


情况3
insert
insert


TX1:                                                      TX2:
insert into testlll values(26,'gaopeng');
                                                             insert into testlll values(27,'gaopeng');
nsert into testlll values(27,'gaopeng');(堵塞)
                                                             insert into testlll values(26,'gaopeng');(堵塞)


死锁

锁结构:

点击(此处)折叠或打开

  1. ---TRANSACTION 422212176315800, not started

  2. 0 lock struct(s), heap size 1160, 0 row lock(s)

  3. ---TRANSACTION 323284, ACTIVE 10 sec inserting

  4. mysql tables in use 1, locked 1

  5. 3 lock struct(s), heap size 1160, 2 row lock(s), undo log entries 1

  6. MySQL thread id 2, OS thread handle 140734663980800, query id 369 localhost root update

  7. insert into testlll values(26,'gaopeng')

  8. ---lock strcut(1):(Add by gaopeng) In modify Version I force check all REC_LOCK/TAB_LOCK for this Trx

  9. TABLE LOCK table `test`.`testlll` trx id 323284 lock mode IX

  10. ---lock strcut(2):(Add by gaopeng) In modify Version I force check all REC_LOCK/TAB_LOCK for this Trx

  11. RECORD LOCKS space id 434 page no 3 n bits 96 index PRIMARY of table `test`.`testlll` trx id 323284 lock_mode X(LOCK_X) locks rec but not gap(LOCK_REC_NOT_GAP)

  12. Record lock, heap no 27 PHYSICAL RECORD: n_fields 4; compact format; info bits 0

  13.  0: len 4; hex 8000001b; asc ;;

  14.  1: len 6; hex 00000004eed4; asc ;;

  15.  2: len 7; hex d3000002a10110; asc ;;

  16.  3: len 7; hex 67616f70656e67; asc gaopeng;;



  17. ---lock strcut(3):(Add by gaopeng) In modify Version I force check all REC_LOCK/TAB_LOCK for this Trx

  18. RECORD LOCKS space id 434 page no 3 n bits 96 index PRIMARY of table `test`.`testlll` trx id 323284 lock mode S(LOCK_S) locks rec but not gap(LOCK_REC_NOT_GAP) waiting(LOCK_WAIT)

  19. Record lock, heap no 26 PHYSICAL RECORD: n_fields 4; compact format; info bits 0

  20.  0: len 4; hex 8000001a; asc ;;

  21.  1: len 6; hex 00000004eed3; asc ;;

  22.  2: len 7; hex d2000002330110; asc 3 ;;

  23.  3: len 7; hex 67616f70656e67; asc gaopeng;;



  24. ---TRANSACTION 323283, ACTIVE 14 sec inserting

  25. mysql tables in use 1, locked 1

  26. LOCK WAIT 3 lock struct(s), heap size 1160, 2 row lock(s), undo log entries 1

  27. MySQL thread id 3, OS thread handle 140734663714560, query id 368 localhost root update

  28. insert into testlll values(27,'gaopeng')

  29. ------- TRX HAS BEEN WAITING 5 SEC FOR THIS LOCK TO BE GRANTED:

  30. RECORD LOCKS space id 434 page no 3 n bits 96 index PRIMARY of table `test`.`testlll` trx id 323283 lock mode S(LOCK_S) locks rec but not gap(LOCK_REC_NOT_GAP) waiting(LOCK_WAIT)

  31. Record lock, heap no 27 PHYSICAL RECORD: n_fields 4; compact format; info bits 0

  32.  0: len 4; hex 8000001b; asc ;;

  33.  1: len 6; hex 00000004eed4; asc ;;

  34.  2: len 7; hex d3000002a10110; asc ;;

  35.  3: len 7; hex 67616f70656e67; asc gaopeng;;

    ------------------

  36. ---lock strcut(1):(Add by gaopeng) In modify Version I force check all REC_LOCK/TAB_LOCK for this Trx

  37. TABLE LOCK table `test`.`testlll` trx id 323283 lock mode IX

  38. ---lock strcut(2):(Add by gaopeng) In modify Version I force check all REC_LOCK/TAB_LOCK for this Trx

  39. RECORD LOCKS space id 434 page no 3 n bits 96 index PRIMARY of table `test`.`testlll` trx id 323283 lock mode S(LOCK_S) locks rec but not gap(LOCK_REC_NOT_GAP) waiting(LOCK_WAIT)

  40. Record lock, heap no 27 PHYSICAL RECORD: n_fields 4; compact format; info bits 0

  41.  0: len 4; hex 8000001b; asc ;;

  42.  1: len 6; hex 00000004eed4; asc ;;

  43.  2: len 7; hex d3000002a10110; asc ;;

  44.  3: len 7; hex 67616f70656e67; asc gaopeng;;


  45. ---lock strcut(3):(Add by gaopeng) In modify Version I force check all REC_LOCK/TAB_LOCK for this Trx

  46. RECORD LOCKS space id 434 page no 3 n bits 96 index PRIMARY of table `test`.`testlll` trx id 323283 lock_mode X(LOCK_X) locks rec but not gap(LOCK_REC_NOT_GAP)

  47. Record lock, heap no 26 PHYSICAL RECORD: n_fields 4; compact format; info bits 0

  48.  0: len 4; hex 8000001a; asc ;;

  49.  1: len 6; hex 00000004eed3; asc ;;

  50.  2: len 7; hex d2000002330110; asc 3 ;;

  51.  3: len 7; hex 67616f70656e67; asc gaopeng;;

以上就是如何理解MYSQL RC模式insert update可能死锁的情况,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注亿速云行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

如何理解MYSQL RC模式insert update可能死锁的情况

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

下载Word文档

编程热搜

目录