Skip to content

Latest commit

 

History

History
138 lines (95 loc) · 2.35 KB

File metadata and controls

138 lines (95 loc) · 2.35 KB

imageimage# Day13

ROLLBACKの動作

START TRANSACTION;
DELETE FROM cart;
SELECT * FROM cart;
ROLLBACK; -- START TRANSACTIONかここまでの命令が無かったことになる
SELECT * FROM cart;

COMMITの動作

  • 端末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;

デッドロック (PostgreSQLのみ)

  • 端末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;