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

这个部分建立在概念信息关于deadlocks 在章节 14.5.5.2, “Deadlock Detection and Rollback”. 

它解释了如何组织数据库操作来减少死锁和随后的错误处理

Deadlocks  是一个经典的问题 在事务性数据库,但是他们不是危险的 除非它们是如此频繁你根本不能运行某个事务。

通常情况下,你必须写你的应用以便他们总是准备重新执行一个事务 如果由于死锁被回滚

InnoDB 使用自动行锁,你可以得到死锁 甚至在只有插入和删除单条记录的情况。

那是因为那些操作不是真正的原子的,他们自动设置锁在(可能的多个)index records上

你能处理死锁和降低他们的发生的可能性使用下面的技术:

1.在任何时候,执行SHOW ENGINE INNODB STATUS命令来确定最近的死锁的原因。那个可以帮助你调整你的应用来避免死锁:

2.如果频繁的死锁警告导致顾虑,收集更多的调试信息通过启用 innodb_print_all_deadlocks  配置选项,

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

3.总是准备重新执行一个事务 如果它回滚由于死锁,Deadlocks 不是危险的,只需要重新尝试

4. 让事务小的和短的让它们不易冲突

5. 在做了一组相关的改变立即提交让他们不易发生冲突。

特别的, 不要把一个活动的mysql session 保持open 对于一个长时间允许的未提交的事务

如果你使用锁定读(SELECT ... FOR UPDATE or SELECT ... LOCK IN SHARE MODE),  尝试使用较低的隔离级别 比如READ COMMITTED.

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

做这些操作在一个一致性的顺序。

然后事务形成良好定义的队列,不会死锁。

7.增加好的索引到你的表, 然后呢查询需要扫描很少的记录,从而设置更少的锁

使用 EXPLAIN SELECT 来确定哪个index 你的查询在使用

8.使用较少的锁,如果你可以负担允许一个SELECT 返回记录从一个老的快照,

不要增加FOR UPDATE or LOCK IN SHARE MODE子句。

使用 READ COMMITTED 隔离级别是好的在这里,因为每个一致性读在相同的事务 读取他自己的最新的快照

9.如果没有其他的帮助, 序列化你的事务使用表级锁。

正确的方式是使用LOCK TABLES,比如InnoDB 表,开始事务设置autocommit = 0

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

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

    14.3.5.3 How to Minimize and Handle Deadlocks 如何减少和处理死锁 这个章节建立关于死锁的概念信息,它解释如何组织数据库操作来减少死锁和随后的错误处理: 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. Mybaitis配置总结

    在mybatis-config.xml中配置分页插件,插件配置必须放在mapper前面 <plugins> <plugin interceptor="com.rrtong. ...

  2. portal开发"下拉框"“日期框”查询要怎么配置

    下面的这些是我今天的成果! 总的来说是一步一步摸索出来的!还是等感谢超哥的耐心指导,犯了一些错误! 1.比如在wd配置文件中中写id=“check_it_two”,在java中写成 checki_it ...

  3. 一个library,相当于一个rootfolder

    picLib.RootFolder.SubFolders 操作library的方式:                         SPList oList = web.Lists[ListName ...

  4. SQL For Xml

    最近遇到点棘手的问题,大致如下: 1.数据局格式: 企业名称 排口名称 监测时间  监测因子 a b c    pH值 a b c   氨氮 a b c    化学需氧量(COD) 企业名称.排口名称 ...

  5. [DB2]实现项目多数据库切换(上)--环境部署

    基本软硬件信息:Windows 8.1 X64 / Microsoft Visual Studio 2012  / ThinkPad S3-S431 安装工具:IBM Data Studio 4.1. ...

  6. linux下安装mysql5.6(官方文档)

    Using the MySQL Yum Repository  /  Installing MySQL on Linux Using the MySQL Yum Repository Chapter ...

  7. GCDTimer

    #import <Foundation/Foundation.h> @interface JKTimerManager : NSObject + (instancetype)sharedT ...

  8. Python:文件操作

    #!/usr/bin/python3 str1 = input("请输入:") print("你输入的是:",str1) f=open("abc.tx ...

  9. highcharts时间图

    这篇文章适合对highcharts已经有一定了解的猿友. 前两天想用highcharts做一个时间图,但是时间轴(x轴)的时间坐标并不是等间隔的,之前一直采用的方法是把时间做成等间隔的,然后没有数据的 ...

  10. 将数字n转换为字符串并保存到s中

    将数字n转换为字符串并保存到s中 参考 C程序设计语言 #include <stdio.h> #include <string.h> //reverse函数: 倒置字符串s中各 ...