知识大全 巧用MySQL InnoDB引擎锁机制解决死锁问题[2]

Posted 索引

篇首语:吃过的馍馍不香,嚼过的甘蔗不甜。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 巧用MySQL InnoDB引擎锁机制解决死锁问题[2]相关的知识,希望对你有一定的参考价值。

巧用MySQL InnoDB引擎锁机制解决死锁问题[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  索引 KEY_TSKTASK_MONTIME (STATUS_ID MON_TIME)

  分析 涉及的两条语句应该不会涉及相同的TSK_TASK记录 那为什么会造成死锁呢?

  查询MySQL官网文档 发现这跟MySQL的索引机制有关 MySQL的InnoDB引擎是行级锁 我原来的理解是直接对记录进行锁定 实际上并不是这样的

  要点如下:

  不是对记录进行锁定 而是对索引进行锁定

  在UPDATE DELETE操作时 MySQL不仅锁定WHERE条件扫描过的所有索引记录 而且会锁定相邻的键值 即所谓的next key locking

  如语句UPDATE TSK_TASK SET UPDATE_TIME = NOW() WHERE ID > 会锁定所有主键大于等于 的所有记录 在该语句完成之前 你就不能对主键等于 的记录进行操作

  当非簇索引(non cluster index)记录被锁定时 相关的簇索引(cluster index)记录也需要被锁定才能完成相应的操作

  再分析一下发生问题的两条SQL语句 就不难找到问题所在了

  当 update TSK_TASK set STATUS_ID= UPDATE_TIME=now () where STATUS_ID= and MON_TIME

  假设 update TSK_TASK set STATUS_ID= UPDATE_TIME=now () where ID in ( ) 几乎同时执行时 本语句首先锁定簇索引(主键) 由于需要更新STATUS_ID的值 所以还需要锁定KEY_TSKTASK_MONTIME 的某些索引记录

  这样第一条语句锁定了KEY_TSKTASK_MONTIME 的记录 等待主键索引 而第二条语句则锁定了主键索引记录 而等待KEY_TSKTASK_MONTIME 的记录 在此情况下 死锁就产生了

  笔者通过拆分第一条语句解决死锁问题

  先查出符合条件的ID select ID from TSK_TASK where STATUS_ID= and MON_TIME < date_sub(now() INTERVAL minute) 然后再更新状态 update TSK_TASK set STATUS_ID= where ID in (… )

  至此 死锁问题彻底解决

cha138/Article/program/MySQL/201311/29601

相关参考

知识大全 Mysql Innodb引擎优化(参数篇)

MysqlInnodb引擎优化(参数篇)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  介绍  

知识大全 MYSQL死锁相关查找

MYSQL死锁相关查找  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  如果遇到死锁了怎么解决呢?

知识大全 轻松掌握MySQL数据库锁机制的相关原理[2]

轻松掌握MySQL数据库锁机制的相关原理[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  不

知识大全 轻松掌握MySQL数据库锁机制的相关原理[1]

轻松掌握MySQL数据库锁机制的相关原理[1]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  在

知识大全 MySQL数据库存储引擎详解

MySQL数据库存储引擎详解  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  存储引擎是什么?  

知识大全 如何选择合适的MySQL存储引擎

如何选择合适的MySQL存储引擎  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  MySQL有多种

知识大全 通过查找引起死锁的的操作即可解决死锁[1]

  说道死锁问题的解决一般情况下我们都是选择KILL进程但如果不查出引起死锁的原因死锁的现象则会频繁出现其实只要通过查找引起死锁的的操作就可以方便的解决死锁  具体的解决方法如下  再死锁发生时我们可

知识大全 用Java+MySQL+PHP轻松构建跨平台的搜索引擎

用Java+MySQL+PHP轻松构建跨平台的搜索引擎  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧

知识大全 通过查找引起死锁的的操作即可解决死锁[2]

    引起数据库死锁的是:进程号其执行的SQL语法如下  EventTypeParametersEventInfo    LanguageEvent  select*fromtest  insert

知识大全 教你巧用PHP+MySQL搭建一个聊天室

教你巧用PHP+MySQL搭建一个聊天室  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!