首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当两个sql使用不同的索引时,innodb为什么生成表锁?

当两个sql使用不同的索引时,innodb为什么生成表锁?
EN

Database Administration用户
提问于 2019-11-03 12:47:41
回答 1查看 115关注 0票数 0

我知道行锁通过添加锁到索引项。但我不明白接下来的场景。

准备sql:

代码语言:javascript
复制
DROP TABLE IF EXISTS `tbl_order`;
CREATE TABLE tbl_order (
    `order_id` BIGINT NOT NULL,
    `product_name` VARCHAR(16) NOT NULL,
    KEY `order_id_idx`(`order_id`),
    KEY `product_name_idx`(`product_name`)
) Engine=InnoDB CHARSET=utf8mb4;
INSERT INTO tbl_order(`order_id`, `product_name`) VALUES(1, 'prod1'), (2, 'prod2');

Session-1执行sql:

代码语言:javascript
复制
SET autocommit=0;
SELECT @@autocommit;
SELECT `order_id`, `product_name` FROM tbl_order WHERE order_id=1 FOR UPDATE;

Session-2执行sql:

代码语言:javascript
复制
SET autocommit=0;
SELECT @@autocommit;
SELECT `order_id`, `product_name` FROM tbl_order WHERE product_name='prod1' FOR UPDATE;

我知道会话-1使用order_id_idx索引项,会话-2使用product_naem_idx索引项.我不明白为什么第一次-1次会议-2次。锁信息:

GEN_CLUST_INDEX表示无害数据库使用表锁。有人能帮我吗?

EN

回答 1

Database Administration用户

发布于 2019-11-03 20:00:07

每个InnoDB表都应该得到一个显式的PRIMARY KEY。它必须是“唯一的”,可以是列(或列的组合),也可以是AUTO_INCREMENT代理项。

GEN_CLUSTER_INDEX是当你不提供PK时的退路。

VALUES(1, 'prod1') --从两种不同的方法(辅助索引)锁定一行。因此,拥有一个锁是相当恰当的。此锁将导致将一个事务延迟到另一个事务完成,或者导致死锁,该死锁将中止(并回滚)其中一个事务。

我不相信你有“桌子锁”,而是“排锁”。

如果您的表是“多对多”映射表,请遵循http://mysql.rjweb.org/doc.php/index_烹饪书_mysql#many_至_许多_映射_表格中的建议。

票数 0
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/252450

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档