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,然后在事物中批量更新
     
  • 相关阅读:
    【Python第九篇】异步IO数据库队列缓存
    【Python第八篇】线程、进程及协程
    【Python第七篇】Socket网络编程
    实验五全部代码,ajax请求
    添加员工
    联级选择
    查询,利用jquery选择器
    列表、表格单选框
    注册
    聊天框
  • 原文地址:https://www.cnblogs.com/it-worker365/p/9292613.html
Copyright © 2011-2022 走看看