START TRANSACTION;
DELETE FROM cart;
SELECT * FROM cart;
ROLLBACK; -- START TRANSACTIONかここまでの命令が無かったことになる
SELECT * FROM cart;- 端末A
START TRANSACTION;
INSERT INTO beans VALUES(14,'スラウェシママサ',900, 'ID',3,4,3,5,5);
-- 確認してみようINSERTした行は見えますか?
SELECT * FROM beans;- 端末B
-- 端末Bでも確認してみようINSERTした行は見えますか?
SELECT * FROM beans;- 端末A
-- トランザクションをコミットする。
COMMIT;
-- 確認してみよう。(当然INSERTは反映されているはず)
SELECT * FROM beans;- 端末B
-- さっきINSERT内容が見えなかった端末Bでも確認してみよう。
SELECT * FROM beans;- 端末A
-- PostgreSQLの場合
START TRANSACTION;
LOCK beans IN ACCESS EXCLUSIVE MODE;-- MySQLの場合
START TRANSACTION;
LOCK TABLES beans WRITE;- 端末B
SELECT * FROM beans;- 端末A
SELECT * FROM beans;-
ロックが効いている?
-
端末A
COMMIT;- 端末A
START TRANSACTION;
SELECT * FROM beans WHERE id_beans = 1 FOR UPDATE;- 端末B
START TRANSACTION;
SELECT * FROM beans WHERE id_beans = 2 FOR UPDATE;
SELECT * FROM beans WHERE id_beans = 1 FOR UPDATE;- 端末A
UPDATE beans SET price = 100000 WHERE id_beans = 1;
COMMIT;- 端末A (beansテーブルの占有ロックを取得)
START TRANSACTION;
LOCK beans IN ACCESS EXCLUSIVE MODE;- 端末B (originテーブルの占有ロックを取得)
START TRANSACTION;
LOCK origin IN ACCESS EXCLUSIVE MODE;- 端末A (originテーブルの占有ロックを取得)→ただし端末Bがロック中なので待たされる
LOCK origin IN ACCESS EXCLUSIVE MODE;- 端末B (beansテーブルの占有ロックを取得)→ただし端末Aがロック中なので待たされ・・・たら、永遠にデッドロック状態
LOCK beans IN ACCESS EXCLUSIVE MODE;
