• 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,然后在事物中批量更新
     
  • 相关阅读:
    Docker ntpdate Permition error
    Sublime+Golang Plugin
    顺序表和链表的区别
    Python 性能优化——对象绑定
    Fix git 提交代码错误
    UVa 10523
    UVa 10551
    UVa 10814
    UVa 10925
    Practice Round China New Grad Test 2014 报告
  • 原文地址:https://www.cnblogs.com/it-worker365/p/9292613.html
Copyright © 2020-2023  润新知