首页 > 解决方案 > Mysql,在更新语句中,条件有主键列和非索引列那么是表级锁定还是行级锁定?

问题描述

关于一个更新查询,我不断收到死锁错误。两个事务都显示下面提到的相同更新语句

表结构是

CREATE TABLE `question` (
    `id` INT(10) NOT NULL AUTO_INCREMENT,
    `questionname` VARCHAR(300) NOT NULL COLLATE 'utf8mb4_0900_ai_ci',
    ctype VARCHAR(20),
    `isActive` TINYINT(3) NOT NULL DEFAULT '0',
    PRIMARY KEY (`id`) USING BTREE
)
COLLATE='utf8mb4_0900_ai_ci'
ENGINE=InnoDB
AUTO_INCREMENT=525672
;

更新声明

UPDATE question SET isActive=1 WHERE id=5 and CType='CTEE';

在我的代码片段id中,主键是主键,其余列不被认为是唯一的,主键列和非索引列都应用于 where 子句。所以我打算从 where 子句中删除列 Ctype(非索引列)。

我的问题是:

  1. 目前 where 子句条件具有主键列和非唯一键。是表级还是行级锁定?
  2. 如果我从 where 子句中删除 Ctype 条件。是很好的解决方案吗?

标签: mysqlsqllockingdatabase-deadlocks

解决方案


推荐阅读