質問
SELECT ... FOR UPDATE
純粋に学問上の理由から、クエリの 1 つ (または など)がロックされた場合にロック待機タイムアウト エラーから回復できる mysql ストアド プロシージャにハンドラーを追加できるかどうか疑問に思っていUPDATE
ます。
例
Repeatable read
これは、空のusers
テーブルが定義された、分離レベルに設定された innoDB データベースを想定しています。
1. 手順例:
DROP PROCEDURE IF EXISTS `lock_test`;
DELIMITER ;;
CREATE PROCEDURE `lock_test`(OUT status ENUM('success','timeout'))
MODIFIES SQL DATA
BEGIN
START TRANSACTION;
SELECT * FROM `users` FOR UPDATE;
SET status := 'success';
COMMIT;
END;;
DELIMITER ;
2. mysql ターミナル 1 でコードを実行します。
START TRANSACTION;
SELECT * FROM `users` FOR UPDATE;
- の内容は
users
表示されますが、トランザクションは開いたままになります。
3. mysql ターミナル 2 でコードを実行します。
CALL `lock_test`(@out);
SELECT @out;
- トランザクションはタイムアウトするまで実行されます (デフォルト値
innodb_lock_wait_timeout
は 50 秒です) 。
プロシージャ内にハンドラーを追加して、lock_test()
@out に「タイムアウト」を保持させることはできますか?