14.3.5.1 An InnoDB Deadlock Example
- 14.3.5 Deadlocks in InnoDB
- 14.3.5.1 An InnoDB Deadlock Example
- 14.3.5.2 Deadlock Detection and Rollback
- 14.3.5.3 How to Minimize and Handle Deadlocks
- 死锁是一种情况,不同的事务是不能处理 因为相互持有一个锁(相互需要的).
- 因为两个事务都在等待一个资源变的可用,都不会释放它持有的锁
- 一个死锁可能发生当事务lock 记录在多个表( 通过语句UPDATE or SELECT ... FOR UPDATE),
- 但是相反的顺序。
- 一个deadlock 可以发生在当类似语句 lock 范围的index records和gaps,
- 每个事务需要一些locks 但是由于时间问题 。
- 为了减少死锁的可能,使用事务而不是lock tables语句;
- 保持事务插入或者更新足够小的数据,它们不能长时间保持打开,
- 当不同的事务修改多个表或者大量的记录,使用同样的操作顺序(比如 SELECT ... FOR UPDATE) 在每个事务
- 里;
- 创建索引在用于 SELECT ... FOR UPDATE and UPDATE ... WHERE statements的列上。
- 死锁的可能性不受隔离级别影响,
- 因为隔离改变了读的行为, 但是deaklock是写的行为。
- 如果一个deadlock 发生, InnoDB 检测状况,回滚其中一个事务。
- 因此, 即使你的逻辑是对的, 你必须处理这种情况,一个事务必须重试。
- 查看最新的死锁信息在InnoDB 用户事务,使用SHOW ENGINE INNODB STATUS命令。
- 如果频繁的deadlocks突出的问题或者应用错误处理,启用innodb_print_all_deadlocks
- 打印死锁的信息到mysqld err log.
- 14.3.5.1 An InnoDB Deadlock Example 一个死锁例子:
- 下面的例子演示了一个错误如何发生当一个lock 请求会导致一个死锁,例子包括两个客户端,A和B:
- 首先,client A 创建一个表包含一条记录,然后开启一个事务 在这个事务里,A得到一个S锁在共享模式:
- mysql> CREATE TABLE t (i INT) ENGINE = InnoDB;
- Query OK, 0 rows affected (1.07 sec)
- mysql> INSERT INTO t (i) VALUES(1);
- Query OK, 1 row affected (0.09 sec)
- mysql> START TRANSACTION;
- Query OK, 0 rows affected (0.00 sec)
- mysql> SELECT * FROM t WHERE i = 1 LOCK IN SHARE MODE;
- +------+
- | i |
- +------+
- | 1 |
- +------+
- 接着,Client B开始一个事务尝试删除记录:
- mysql> START TRANSACTION;
- Query OK, 0 rows affected (0.00 sec)
- mysql> DELETE FROM t WHERE i = 1; --Hang
- The delete operation requires an X lock. The lock cannot be granted because it is incompatible
- with the S lock that client A holds, so the request goes on the queue of lock requests for the
- row and client B blocks.
- Finally, client A also attempts to delete the row from the table:
- 删除操作 需要一个X锁, lock不能被立即授权 因为它不兼容S锁,Client A持有的,
- 因此请求在锁请求队列上,Client B被堵塞
- 最终,客户端A 试图删除表中的记录:
- mysql> DELETE FROM t WHERE i = 1;
- ERROR 1213 (40001): Deadlock found when trying to get lock;
- try restarting transaction
- 客户端 B:
- mysql> DELETE FROM t WHERE i = 1;
- ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction
- 这里发生死锁, 因为客户端A需要一个X锁 来删除记录,
- 然而,lock 请求不能理解被授权因为clientB 已经有一个X锁的请求,
- 等待客户端A释放S锁。
- 也不能将A持有的S锁升级为X锁,因为之前B的请求一个X锁,结果,
- InnoDB 产生一个错误在其中的一个客户端,然后释放锁,客户端返回错误:
14.3.5.1 An InnoDB Deadlock Example的更多相关文章
- 14.5.5.1 An InnoDB Deadlock Example 一个InnoDB 死锁实例
14.5.5.1 An InnoDB Deadlock Example 一个InnoDB 死锁实例 下面的例子演示了一个错误可以发生当一个lock 请求会导致一个死锁,例子设计2个客户端,A和B: J ...
- 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 ...
- 14.7.1 Resizing the InnoDB System Tablespace InnoDB 系统表空间大小
14.7.1 Resizing the InnoDB System Tablespace InnoDB 系统表空间大小 这个章节描述如何增加或者减少 InnoDB 系统表空间的大小 增加InnoDB ...
- 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 是一个线程 执行各种任务在后台. ...
- 14.6.3.5 Configuring InnoDB Buffer Pool Flushing
14.6.3.5 Configuring InnoDB Buffer Pool Flushing InnoDB 执行某些任务在后台, 包括脏叶的刷新(那些已经发生改变的pages 但是没有写入到数据文 ...
- 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/ ...
- 14.6.3.1 The InnoDB Buffer Pool
14.6.3.1 The InnoDB Buffer Pool InnoDB 保持一个存储区域被称为buffer pool 用于cache数据和索引在内存里, 知道InnoDB buffer pool ...
- 14.6.7?Limits on InnoDB Tables InnoDB 表的限制
14.6.7?Limits on InnoDB Tables InnoDB 表的限制 警告: 不要把MySQL system tables 从MyISAM 到InnoDB 表. 这是不支持的操作,如果 ...
- 14.1.3 Turning Off InnoDB 关掉InnoDB
14.1.3 Turning Off InnoDB 关掉InnoDB: Oracle 推荐InnoDB 作为首选的存储引擎用于典型的数据库应用,从单用户的wikis到博客, 到高端应用把性能推到极限. ...
随机推荐
- Online SVG to PNG/JPEG/TIFF conversion
Online SVG to PNG/JPEG/TIFF conversion SVG to raster image conversion
- UITabBarController中自定义UITabBar
1.创建多个视图控制器,放如UITabBarController中 AViewController *aa = [[AViewController alloc] init]; UINavigation ...
- C++ 左值 右值
最近在研究C++ 左值 右值,搬运.收集了一些别人的资料,供自己记录和学习,若以后看到了更好的解释,会继续补充.(打“?”是我自己不明白的地方 ) 参考:<Boost程序库探秘——深度解析C ...
- Eclipse用法和技巧二十一:工程的展示途径
用eclipse阅读代码的时候,有时候代码会变成如图一所示的样子,有时候可能是图二的样子.为什么有时候是图一有时候是图二,笔者也不是很清楚.不过怎么手动设置成图一图二,就是接下来要讲的东西. 1 ...
- 微信jsSDK开发
(学习类)2015年最新微信公众平台开发 微信JSSDK开发分享功能 链接地址:http://blog.163.com/sdolove@126/blog/static/1146378852015132 ...
- SMTP命令 发送邮件 DOS命令
1.实例:从qq邮箱 发送到其他地址的邮箱 >telnet smtp.qq.com 25 >helo qq.com >auth login >NzI3MTU0MTg3QHFxL ...
- 稳定婚姻问题和Gale-Shapley算法(转)
什么是算法?每当有人问作者这样的问题时,他总会引用这个例子:假如你是一个媒人,有若干个单身男子登门求助,还有同样多的单身女子也前来征婚.如果你已经知道这些女孩儿在每个男孩儿心目中的排名,以及男孩儿们在 ...
- 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 ...
- 执行shell脚本提示“syntax error near unexpected token for((i=0;i<$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 ...
- 数据库元数据MetaData
本篇介绍数据库方面的元数据(MetaData)的有关知识.元数据在建立框架和架构方面是特别重要的知识,再下一篇我们仿造开源数据库工具类DbUtils就要使用数据库的元数据来创建自定义JDBC框架. 在 ...