1. 14.3.5 Deadlocks in InnoDB
  2.  
  3. 14.3.5.1 An InnoDB Deadlock Example
  4. 14.3.5.2 Deadlock Detection and Rollback
  5. 14.3.5.3 How to Minimize and Handle Deadlocks
  6.  
  7. 死锁是一种情况,不同的事务是不能处理 因为相互持有一个锁(相互需要的).
  8.  
  9. 因为两个事务都在等待一个资源变的可用,都不会释放它持有的锁
  10.  
  11. 一个死锁可能发生当事务lock 记录在多个表( 通过语句UPDATE or SELECT ... FOR UPDATE),
  12.  
  13. 但是相反的顺序。
  14.  
  15. 一个deadlock 可以发生在当类似语句 lock 范围的index recordsgaps,
  16.  
  17. 每个事务需要一些locks 但是由于时间问题
  18.  
  19. 为了减少死锁的可能,使用事务而不是lock tables语句;
  20.  
  21. 保持事务插入或者更新足够小的数据,它们不能长时间保持打开,
  22.  
  23. 当不同的事务修改多个表或者大量的记录,使用同样的操作顺序(比如 SELECT ... FOR UPDATE) 在每个事务
  24.  
  25. 里;
  26.  
  27. 创建索引在用于 SELECT ... FOR UPDATE and UPDATE ... WHERE statements的列上。
  28.  
  29. 死锁的可能性不受隔离级别影响,
  30. 因为隔离改变了读的行为, 但是deaklock是写的行为。
  31.  
  32. 如果一个deadlock 发生, InnoDB 检测状况,回滚其中一个事务。
  33.  
  34. 因此, 即使你的逻辑是对的, 你必须处理这种情况,一个事务必须重试。
  35.  
  36. 查看最新的死锁信息在InnoDB 用户事务,使用SHOW ENGINE INNODB STATUS命令。
  37.  
  38. 如果频繁的deadlocks突出的问题或者应用错误处理,启用innodb_print_all_deadlocks
  39.  
  40. 打印死锁的信息到mysqld err log.
  41.  
  42. 14.3.5.1 An InnoDB Deadlock Example 一个死锁例子:
  43.  
  44. 下面的例子演示了一个错误如何发生当一个lock 请求会导致一个死锁,例子包括两个客户端,AB:
  45.  
  46. 首先,client A 创建一个表包含一条记录,然后开启一个事务 在这个事务里,A得到一个S锁在共享模式:
  47.  
  48. mysql> CREATE TABLE t (i INT) ENGINE = InnoDB;
  49. Query OK, 0 rows affected (1.07 sec)
  50.  
  51. mysql> INSERT INTO t (i) VALUES(1);
  52. Query OK, 1 row affected (0.09 sec)
  53.  
  54. mysql> START TRANSACTION;
  55. Query OK, 0 rows affected (0.00 sec)
  56.  
  57. mysql> SELECT * FROM t WHERE i = 1 LOCK IN SHARE MODE;
  58. +------+
  59. | i |
  60. +------+
  61. | 1 |
  62. +------+
  63.  
  64. 接着,Client B开始一个事务尝试删除记录:
  65.  
  66. mysql> START TRANSACTION;
  67. Query OK, 0 rows affected (0.00 sec)
  68.  
  69. mysql> DELETE FROM t WHERE i = 1; --Hang
  70.  
  71. The delete operation requires an X lock. The lock cannot be granted because it is incompatible
  72.  
  73. with the S lock that client A holds, so the request goes on the queue of lock requests for the
  74.  
  75. row and client B blocks.
  76.  
  77. Finally, client A also attempts to delete the row from the table:
  78.  
  79. 删除操作 需要一个X锁, lock不能被立即授权 因为它不兼容S锁,Client A持有的,
  80.  
  81. 因此请求在锁请求队列上,Client B被堵塞
  82.  
  83. 最终,客户端A 试图删除表中的记录:
  84.  
  85. mysql> DELETE FROM t WHERE i = 1;
  86. ERROR 1213 (40001): Deadlock found when trying to get lock;
  87. try restarting transaction
  88.  
  89. 客户端 B:
  90.  
  91. mysql> DELETE FROM t WHERE i = 1;
  92. ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction
  93.  
  94. 这里发生死锁, 因为客户端A需要一个X 来删除记录,
  95.  
  96. 然而,lock 请求不能理解被授权因为clientB 已经有一个X锁的请求,
  97.  
  98. 等待客户端A释放S锁。
  99.  
  100. 也不能将A持有的S锁升级为X锁,因为之前B的请求一个X锁,结果,
  101.  
  102. InnoDB 产生一个错误在其中的一个客户端,然后释放锁,客户端返回错误:

14.3.5.1 An InnoDB Deadlock Example的更多相关文章

  1. 14.5.5.1 An InnoDB Deadlock Example 一个InnoDB 死锁实例

    14.5.5.1 An InnoDB Deadlock Example 一个InnoDB 死锁实例 下面的例子演示了一个错误可以发生当一个lock 请求会导致一个死锁,例子设计2个客户端,A和B: J ...

  2. 14.5.5 Deadlocks in InnoDB

    14.5.5 Deadlocks in InnoDB 14.5.5.1 An InnoDB Deadlock Example 14.5.5.2 Deadlock Detection and Rollb ...

  3. 14.7.1 Resizing the InnoDB System Tablespace InnoDB 系统表空间大小

    14.7.1 Resizing the InnoDB System Tablespace InnoDB 系统表空间大小 这个章节描述如何增加或者减少 InnoDB 系统表空间的大小 增加InnoDB ...

  4. 14.6.8 Configuring the InnoDB Master Thread IO Rate 配置InnoDB 主线程IO 速率:

    14.6.8 Configuring the InnoDB Master Thread IO Rate 配置InnoDB 主线程IO 速率: 主线程 在InnoDB 是一个线程 执行各种任务在后台. ...

  5. 14.6.3.5 Configuring InnoDB Buffer Pool Flushing

    14.6.3.5 Configuring InnoDB Buffer Pool Flushing InnoDB 执行某些任务在后台, 包括脏叶的刷新(那些已经发生改变的pages 但是没有写入到数据文 ...

  6. 14.6.3.4 Configuring InnoDB Buffer Pool Prefetching (Read-Ahead) 配置InnoDB Buffer pool 预取

    14.6.3.4 Configuring InnoDB Buffer Pool Prefetching (Read-Ahead) 配置InnoDB Buffer pool 预取 一个预读请求是一个I/ ...

  7. 14.6.3.1 The InnoDB Buffer Pool

    14.6.3.1 The InnoDB Buffer Pool InnoDB 保持一个存储区域被称为buffer pool 用于cache数据和索引在内存里, 知道InnoDB buffer pool ...

  8. 14.6.7?Limits on InnoDB Tables InnoDB 表的限制

    14.6.7?Limits on InnoDB Tables InnoDB 表的限制 警告: 不要把MySQL system tables 从MyISAM 到InnoDB 表. 这是不支持的操作,如果 ...

  9. 14.1.3 Turning Off InnoDB 关掉InnoDB

    14.1.3 Turning Off InnoDB 关掉InnoDB: Oracle 推荐InnoDB 作为首选的存储引擎用于典型的数据库应用,从单用户的wikis到博客, 到高端应用把性能推到极限. ...

随机推荐

  1. Online SVG to PNG/JPEG/TIFF conversion

    Online SVG to PNG/JPEG/TIFF conversion SVG to raster image conversion

  2. UITabBarController中自定义UITabBar

    1.创建多个视图控制器,放如UITabBarController中 AViewController *aa = [[AViewController alloc] init]; UINavigation ...

  3. C++ 左值 右值

    最近在研究C++ 左值 右值,搬运.收集了一些别人的资料,供自己记录和学习,若以后看到了更好的解释,会继续补充.(打“?”是我自己不明白的地方 )   参考:<Boost程序库探秘——深度解析C ...

  4. Eclipse用法和技巧二十一:工程的展示途径

    用eclipse阅读代码的时候,有时候代码会变成如图一所示的样子,有时候可能是图二的样子.为什么有时候是图一有时候是图二,笔者也不是很清楚.不过怎么手动设置成图一图二,就是接下来要讲的东西. 1    ...

  5. 微信jsSDK开发

    (学习类)2015年最新微信公众平台开发 微信JSSDK开发分享功能 链接地址:http://blog.163.com/sdolove@126/blog/static/1146378852015132 ...

  6. SMTP命令 发送邮件 DOS命令

    1.实例:从qq邮箱 发送到其他地址的邮箱 >telnet smtp.qq.com 25 >helo qq.com >auth login >NzI3MTU0MTg3QHFxL ...

  7. 稳定婚姻问题和Gale-Shapley算法(转)

    什么是算法?每当有人问作者这样的问题时,他总会引用这个例子:假如你是一个媒人,有若干个单身男子登门求助,还有同样多的单身女子也前来征婚.如果你已经知道这些女孩儿在每个男孩儿心目中的排名,以及男孩儿们在 ...

  8. CF 319D(Have You Ever Heard About the Word?-模拟)

    D. Have You Ever Heard About the Word? time limit per test 6 seconds memory limit per test 256 megab ...

  9. 执行shell脚本提示“syntax error near unexpected token for((i=0;i&lt;$length;i++))”

    sh脚本例如以下: #!/usr/bin/env bash county="3 4 5 6 7 8 9 10 11 12 16 29 39 44 53 62 72 84 97 115 128 ...

  10. 数据库元数据MetaData

    本篇介绍数据库方面的元数据(MetaData)的有关知识.元数据在建立框架和架构方面是特别重要的知识,再下一篇我们仿造开源数据库工具类DbUtils就要使用数据库的元数据来创建自定义JDBC框架. 在 ...