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,然后在事物中批量更新
     
  • 相关阅读:
    pointnet++之classification/train.py
    pointnet++的pytorch实现
    xavier初始化的简单推导
    z+f数据解析
    ubuntu安装dia
    卷积,reLu,池化的意义
    Split
    .net程序调试一:快速定位异常
    Memcached (第一篇)
    System.Web.Caching.Cache类 缓存 各种缓存依赖
  • 原文地址:https://www.cnblogs.com/it-worker365/p/9292613.html
Copyright © 2011-2022 走看看