14.3.5.3 How to Minimize and Handle Deadlocks 如何减少和处理死锁

这个章节建立关于死锁的概念信息,它解释如何组织数据库操作来减少死锁和随后的错误处理:

Deadlocks 是一个金典问题在事务数据库, 但是它们并不危险除非它们是如此拼单

以至于你根本不能运行某些事务

你必须写你的应用 以便它们总是准备重新执行一个事务 如果被回滚

InnoDB 使用自动row-level locking, 你可以得到死锁甚至在事务里,

插入或者删除单行记录。

那是因为那些操作不是真正的"原子的", 它们自动设置锁在(可能的多个)插入或者删除的index records。

你能处理 deadlocks 和降低其发生的可能性 使用下面的技术:

1.在任何时间, 执行SHOW ENGINE INNODB STATUS 命令来确定最近的死锁信息。

这个有助于你调整你的应用避免死锁:

2.如果频繁的死锁警告,搜集更多的扩展调试信息通过启用 innodb_print_all_deadlocks  配置选项

信息关于每个死锁信息, 不只是最后一个, 是记录在MySQL error log. 

关闭这个选项当你完成调试时:

总是准备重新执行一个事务如果由于死锁失败,死锁并不危险,只是猜尝试一次

3. 保持事务尽可能的小和短,使它们不容易冲突

4.  立即提交事务 在做了一组相关的改变让它们不易冲突。

特别的, 不要让一个交互的mysql session 打开很长一段时间,没有提交事务

5. 如果你使用locking reads(SELECT ... FOR UPDATE or SELECT ... LOCK IN SHARE MODE),

尝试使用一个较低的隔离级别 比如READ COMMITTED

6. 当在一个事务里修改多个表, 或者相同表的不同结果集,

做这些操作每次按一致的顺序。 然后事务形成良好的定义的队列,也不会死锁。

比如, 组织表操作到函数里,或者调用存储过程,相比编码很多类似的插入,更新和删除语句的类似序列在不同

的地方。
7. 在你的表上增加精心选项的索引,然后你的查询需要扫描更少的index records从而设置更少的锁, 使用EXPLAIN SELECT to 确定哪个索引MySQL 服务器视为最合适你查询的索引 8.使用更少的锁,你可以容许一个SELECT 从老的快照返回谁, 不需要增加子句 FOR UPDATE or LOCK IN SHARE MODE。 使用READ COMMITTED隔离级别在这里是更好的,因为每个一致性读在相同的事务读取它自己最新鲜的快照。 9.如果没有其他帮助,序列化你的事务 使用表级锁。 正确的方式是使用LOCK TABLES 在你的事务表上,比如InnoDB 表, 开始事务设置 autocommit = 0 不是START TRANSACTION (关闭自动提交) 不要调用unlock tables 直到你显示的提交事务。 比如,如果你需要写一个表t1,从表t2读取,你可以这么做: SET autocommit=0;
LOCK TABLES t1 WRITE, t2 READ, ...;
... do something with tables t1 and t2 here ...
COMMIT;
UNLOCK TABLES; Table-level locks 阻止并发更新表, 避免死锁代价是更少的响应对于一个繁忙的系统

14.3.5.3 How to Minimize and Handle Deadlocks 如何减少和处理死锁的更多相关文章

  1. 14.5.5.3 How to Minimize and Handle Deadlocks 如何减少和处理死锁

    14.5.5.3 How to Minimize and Handle Deadlocks 如何减少和处理死锁 这个部分建立在概念信息关于deadlocks 在章节 14.5.5.2, "D ...

  2. [LeetCode] 924. Minimize Malware Spread 最大程度上减少恶意软件的传播

    In a network of nodes, each node i is directly connected to another node j if and only if graph[i][j ...

  3. 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 ...

  4. 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 Rollb ...

  5. MySQL error : Deadlock found when trying to get lock; try restarting transaction

    在使用 MySQL 时,我们有时会遇到这样的报错:“Deadlock found when trying to get lock; try restarting transaction”. 在 14. ...

  6. (转)雅虎WEB前端网站优化 -- 34条军规

    雅虎给出了优化网站加载速度的34条法则(包括Yslow规则22条) 详细说明,下载转发 ponytail 的译文(来自帕兰映像). 1.Minimize HTTP Requests 减少HTTP请求 ...

  7. 雅虎WEB前端网站优化 -- 34条军规

    雅虎给出了优化网站加载速度的34条法则(包括Yslow规则22条) 详细说明,下载转发 ponytail 的译文(来自帕兰映像). 1.Minimize HTTP Requests 减少HTTP请求 ...

  8. Effective Objective-C [上]

    网上看到的 http://esoftmobile.com/2013/08/10/effective-objective-c/ 本文是针对<Effective Objective-C>一书的 ...

  9. Yahoo34条军规——雅虎WEB前端网站优化

    雅虎给出了优化网站加载速度的34条法则(包括Yslow规则22条) 详细说明,下载转发 ponytail 的译文(来自帕兰映像). 1.Minimize HTTP Requests 减少HTTP请求 ...

随机推荐

  1. 改动项目APP名字后,在真机执行报错:The provisioning profile specified in your build settings (“haotian”) has an AppI

    错误提醒:The provisioning profile specified in your build settings ("haotian") has an AppID of ...

  2. hdu 4940 Destroy Transportation system( 无源汇上下界网络流的可行流推断 )

    题意:有n个点和m条有向边构成的网络.每条边有两个花费: d:毁坏这条边的花费 b:重建一条双向边的花费 寻找这样两个点集,使得点集s到点集t满足 毁坏全部S到T的路径的费用和 > 毁坏全部T到 ...

  3. LoadRunner 监控 Apache

    配置Apache部分 1.修改Apache中Httpd.conf文件 <Location /server-status> SetHandler server-status Order de ...

  4. linux内核中send与recv函数详解

    Linux send与recv函数详解 1.简介 #include <sys/socket.h> ssize_t recv(int sockfd, void *buff, size_t n ...

  5. 服务确定撤销/删除/关闭 (ml81n)

    FUNCTION zrfc_mm006. *"---------------------------------------------------------------------- * ...

  6. 【linux】linux启动流程

    欢迎转载,转载时请保留作者信息,谢谢. 邮箱:tangzhongp@163.com 博客园地址:http://www.cnblogs.com/embedded-tzp Csdn博客地址:http:// ...

  7. PHP 页面跳转到另一个页面的几种方法分享

    如何在 PHP 中从一个页面重定向到另外一个页面呢?今天 清源 为大家列举出了三种办法,供大家来参考. 一.用HTTP头信息  也就是用PHP的HEADER函数.PHP里的HEADER函数的作用就是向 ...

  8. IT段子,娱乐一下

    1.我是个程序员,一天我坐在路边一边喝水一边苦苦检查bug.这时一个乞丐在我边上坐下了,开始要饭,我觉得可怜,就给了他1块钱,然后接着调试程序.他可能生意不好,就无聊的看看我在干什么,然后过了一会,他 ...

  9. java.exe路径问题

    因为要更换JDK版本,自然也就要重新设置JAVA_HOME环境变量,但设置完成后奇怪的发现,运行java -version时还是原来的版本,莫名其妙,最后我把JAVA_HOME环境变量删除竟然java ...

  10. Extjs实现树形结构三连选

    当项目中需要一个部门人员选择或者省市县地域连选时,就需要树形结构的连选. 再此,写了一个简单的树形结构三连选功能,模拟从后台读取数据和处理数据(欢迎大家交流指正). 代码如下: 循环创建三棵树,其中只 ...