8. ギャップロック同士は
ブロックしない
5
6
10
id (pk)
tx A tx B
SELECT * FROM t
WHERE id = 4 FOR UPDATE
BEGIN BEGIN
SELECT * FROM t
WHERE id = 3 FOR UPDATE
INSERT INTO t (id) VALUES(4)
INSERT INTO t (id) VALUES(3)
同じギャップ空間だけど止まらない
Deadlock Error
8
9. ちなみに
5
6
10
id (pk)
tx A tx B
BEGIN BEGIN
INSERT INTO t (id) VALUES(4)
INSERT INTO t (id) VALUES(3)
これはデッドロックにならない
9
12. 共有 -> 排他ロック
5
6
10
id (pk)
tx A tx B
SELECT * FROM t
WHERE id = 5 FOR UPDATE
BEGIN BEGIN
INSERT INTO t (id) VALUES (5)
SELECT * FROM t
WHERE id = 5 FOR UPDATE
Deadlock Error
Err: Duplicate Entry…
12
13. だったらIGNORE?
$dbh->do( BEGIN );
$res = $dbh->do( INSERT IGNORE );
if (!$res) {
$row = $dbh->do( SELECT FOR UPDATE );
};
マサカリ投げていく所存
無視しても共有ロックは取られる
13