快捷搜索:  as  2018  FtCWSyGV  С˵  test  xxx  Ψһ  w3viyKQx

网络AG百家家乐一直赢_巧用MySQL InnoDB引擎锁机制解决死锁问题



近来,在项目开拓历程中,碰着了数据库逝世锁问题,在办理问题的历程中,笔者对MySQL InnoDB引擎锁机制的理解慢慢加深。

案例如下:

在应用Show innodb status反省引擎状态时,发清楚明了逝世锁问题:

奸淫 (1) TRANSACTION:

TRANSACTION 0 677833455, ACTIVE 0 sec, process no 11393, OS thread id 278546 starting index read

mysql tables in use 1, locked 1

LOCK WAIT 3 lock struct(s), heap size 320

MySQL thread id 83, query id 162348740 dcnet03 dcnet Searching rows for update

update TSK_TASK set STATUS_ID=1064,UPDATE_TIME=now () where STATUS_ID=1061 and MON_TIME

阐发,涉及的两条语句应该不会涉及相同的TSK_TASK记录,那为什么会造成逝世锁呢?

查询MySQL官网文档,发明这跟MySQL的索引机网络AG百家家乐一直赢制有关。MySQL的InnoDB引擎是行级锁,我原本的理解是直接对记录进行锁定,实际上并不是这样的。

要点如下:

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

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

如语句UPDATE TSK_TASK SET UPDATE_TIME = NOW() WHERE ID > 10000会锁定所有主键大年夜于即是1000的所有记录,在该语网络AG百家家乐一直赢句完成之前,你就不能对主键即是10000的记录进行操作;

当非簇索引(n网络AG百家家乐一直赢on-cluster index)记录被锁准时,相关的簇索引(cluster index)记录也必要被锁定才能完成响应的操作。

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

当“update TSK_TASK set STATUS_ID=网络AG百家家乐一直赢1064,UPDATE_TIME=now () where STATUS_ID=1061 and MON_TIME笔者经由过程拆分第网络AG百家家乐一直赢一条语句办理逝世锁问题:

先查出相符前提的ID:select ID from TSK_TASK where STATUS_ID=1061 and MON_TIME

您可能还会对下面的文章感兴趣: