SKIP LOCKEDを使ったジョブキューイング1. 最初にAが1行取得する Session A │Session B
=====================================================│===================================================
PG=> BEGIN; SELECT * FROM jobs WHERE status = 'p │PG=>
ending' LIMIT 1 FOR UPDATE SKIP LOCKED; │PG=>
BEGIN │PG=>
id | status │PG=>
----+--------- │PG=>
1 | pending │PG=>
(1 rows) │PG=>
│PG=>
PG=*> │PG=> BEGIN; SELECT * FROM jobs FOR UPDATE SKIP L
PG=*> │OCKED;
PG=*> │BEGIN
PG=*> │ id | status
PG=*> │----+---------
PG=*> │ 2 | pending
PG=*> │ 3 | pending
PG=*> │(2 rows)
2. 次にAが取得した行をUPDATEしてCOMMITする PG=*> UPDATE jobs SET status = 'runnnig' WHERE i │PG=*>
d = 1; │PG=*>
UPDATE 1 │PG=*>
PG=*> │PG=*> SELECT * FROM jobs FOR UPDATE SKIP LOCKED;
│ id | status
│----+---------
│ 2 | pending
│ 3 | pending
│(2 rows)
│
│PG=*>
PG=*> COMMIT; │PG=*>
COMMIT │PG=*>
PG=> │PG=*> SELECT * FROM jobs FOR UPDATE SKIP LOCKED;
│ id | status
│----+---------
│ 2 | pending
│ 3 | pending
│ 1 | runnnig
│(3 rows)
参考 |
|