我知道行锁通过添加锁到索引项。但我不明白接下来的场景。
准备sql:
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:
SET autocommit=0;
SELECT @@autocommit;
SELECT `order_id`, `product_name` FROM tbl_order WHERE order_id=1 FOR UPDATE;Session-2执行sql:
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表示无害数据库使用表锁。有人能帮我吗?
发布于 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_至_许多_映射_表格中的建议。
https://dba.stackexchange.com/questions/252450
复制相似问题