MySQL のトランザクション SAVEPOINT と行ロック

あるトランザクション内で取得した行ロックを途中で解放する方法はないのかと、SAVEPOINT について調べていたのだが、どうやらロールバックしない限りは解放されないみたい。

(1) セッション A

BEGIN;

SAVEPOINT sample;

# 行ロック取得
SELECT * FROM some_table WHERE key = 1234 FOR UPDATE;

(2) セッション B

BEGIN;

# 行ロックを取得しようとするが、セッション A がロック取得しているのでブロックされる
SELECT * FROM some_table WHERE key = 1234 FOR UPDATE;

(3-1) セッション A

RELEASE SAVEPOINT sample;

セーブポイントを削除してもセッション A が取得している行ロックは解放されませんでした。
つまり、セッション B の select 文はブロックされたまま。

(3-2) セッション A

ROLLBACK TO SAVEPOINT sample;

セーブポイントをロールバックすると、セッション A が取得している行ロックは解放されました

Last updated on December 24, 2015