作者knives ()
看板Database
标题[SQL ] 用了lockForUpdate,依然死锁,请问跟复合索引有关吗
时间Tue Apr 26 17:14:37 2022
资料库名称: Aurora mySQL
资料库版本:
内容/问题描述:
我有一个表格 Schema
CREATE TABLE `credit` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`company_id` int(10) unsigned NOT NULL,
`agent_id` int(10) unsigned NOT NULL,
`balance_before` decimal(15,5) NOT NULL,
`amount` decimal(15,5) NOT NULL,
`balance_after` decimal(15,5) NOT NULL,
`created_at` datetime NOT NULL,
`updated_at` datetime NOT NULL,
PRIMARY KEY (`id`),
KEY `agent_amount` (`agent_id`,`amount`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
我在做交易的时候下了
SELECT * FROM credit Where agent_id = "{agent_id}" FOR UPDATE
UPDATE credit set amount = "amount" WHERE agent_id = "{agent_id}"
在高并发的情境下,很容易发生 DeadLock
请问如果我的索引是用复合索引,是否不会是行锁而是表锁
谢谢回覆
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 175.180.80.96 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Database/M.1650964479.A.BF0.html
1F:推 parkerchung: 可以试试看把agent_id 加上index 04/28 16:14
2F:→ arcade0425: 比较粗略的解释(概念上不完全正确), 05/01 14:10
3F:→ arcade0425: for update 锁的不是行,是 index,你在第一个 trx 05/01 14:10
4F:→ arcade0425: 改变了原本的 index,原本被卡住的第二个 trx 等到锁 05/01 14:10
5F:→ arcade0425: 终於释放时找不到自己要锁的 index 在哪,mysql 就帮 05/01 14:10
6F:→ arcade0425: 你 rollback 第二个 trx 了 05/01 14:10
7F:→ arcade0425: 解法上建议是直接把原本建的 index 删除,再把 agent 05/01 14:13
8F:→ arcade0425: _id 单独加 index,只多加一个 index 但没有把原本的 05/01 14:13
9F:→ arcade0425: index 删除, query 可能还是会使用原本两个一起的 05/01 14:13
10F:→ arcade0425: index 造成 Deadlock 05/01 14:13