zoukankan      html  css  js  c++  java
  • Mysql 死锁分析学习

     
    * CREATE TABLE `user_item` (
    * `id` BIGINT(20) NOT NULL,
    * `user_id` BIGINT(20) NOT NULL,
    * `item_id` BIGINT(20) NOT NULL,
    * `status` TINYINT(4) NOT NULL,
    * PRIMARY KEY (`id`),
    * KEY `idx_1` (`user_id`,`item_id`,`status`)
    * ) ENGINE=INNODB DEFAULT CHARSET=utf-8
     
    Mysql innodb存储引擎行级锁是锁索引,如果表上没有用到索引则变为表级锁,如果用到主键索引则先锁主键后锁其他索引,如果没有用到主键索引,则先锁其他索引,再锁主键索引,高并发更新一定要带上主键,优先获得主键上的锁,防止死锁
    上表中包含了`id`为聚簇主键索引,`idx_1`为非主键索引,如果一条SQL包含了主键索引,则锁定主键索引,如果包含非主键索引,则先锁定非主键索引,再锁定主键索引。
     
    下面的SQL用到了非主键索引`idx_1`,所以先锁住非主键索引再锁主索引
    update user_item set status=1 where user_id=? and item_id=?
     
    此时如果有一条语句包含主键索引
    update user_item .....where id=? and user_id=?
     
    则系统可能发生死锁,语句1锁定了非主键索引,正在准备锁定主键索引,语句2锁定主键索引,准备锁定非主键索引
     
    解决方法就是先获取需要处理的ID,然后在事物中批量更新
     
  • 相关阅读:
    Go语言通道(chan)——goroutine之间通信的管道
    GO语言数组,切片,MAP总结
    GO数组
    GO切片
    GO语言测试
    GO语言html模板
    Go语言中defer语句使用小结
    微信小程序 某个页面直接返回首页
    小程序常用变量
    bzoj1030
  • 原文地址:https://www.cnblogs.com/it-worker365/p/9292613.html
Copyright © 2011-2022 走看看