標題

[SQL ] 用了lockForUpdate,依然死鎖,請問跟複合索引有關嗎

看板DatabaseDB板作者knives
時間. (2022-04-26 17:14:37)
推文10則 (1推 0噓 9→)
資料庫名稱: 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

請問如果我的索引是用複合索引,是否不會是行鎖而是表鎖
謝謝回覆
--
※ 發信站: 批踢踢實業坊(pttweb.tw), 來自: 175.180.80.96 (臺灣)
※ 文章網址: https://pttweb.tw/Database/M.1650964479.A.BF0
#1
: 可以試試看把agent_id 加上index04/28 16:14
#2
: 比較粗略的解釋(概念上不完全正確),05/01 14:10
#3            for update 鎖的不是行,是 index,你在第一個 trx05/01 14:10
#4            改變了原本的 index,原本被卡住的第二個 trx 等到鎖05/01 14:10
#5            終於釋放時找不到自己要鎖的 index 在哪,mysql 就幫05/01 14:10
#6            你 rollback 第二個 trx 了05/01 14:10
#7            解法上建議是直接把原本建的 index 刪除,再把 agent05/01 14:13
#8            _id 單獨加 index,只多加一個 index 但沒有把原本的05/01 14:13
#9             index 刪除, query 可能還是會使用原本兩個一起的05/01 14:13
#10            index 造成 Deadlock05/01 14:13

相關文章