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,然后在事物中批量更新
     
  • 相关阅读:
    FMDB增删查改
    https相关内容
    支付宝、微信支付参考博客
    下标脚本(Swift)
    函数(swift)
    控制流(swift)
    UIView Methods
    oc js 交互
    我和Lua并非一见钟情,我们期待着日久生情(相遇篇)
    与Python Falling In Love_Python跨台阶(面向对象)
  • 原文地址:https://www.cnblogs.com/it-worker365/p/9292613.html
Copyright © 2011-2022 走看看