YanoRyuichi.com/
Wiki
Blog
GitHub
Sandbox
開始行:
* SKIP LOCKEDを使ったジョブキューイング [#kd5e73b7]
** 1. 最初にAが1行取得する [#ff38e4ed]
Session A │Se...
=====================================================│==...
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...
PG=*> │OC...
PG=*> │BE...
PG=*> │ i...
PG=*> │--...
PG=*> │ ...
PG=*> │ ...
PG=*> │(2...
- Aが'''FOR UPDATE SKIP LOCKED'''を指定してjobsテーブルか...
- BはjobsテーブルからID:1を除いたID:2とID:3の行しかSELECT...
** 2. 次にAが取得した行をUPDATEしてCOMMITする [#ef39c1c4]
PG=*> UPDATE jobs SET status = 'runnnig' WHERE i │PG...
d = 1; │PG...
UPDATE 1 │PG...
PG=*> │PG...
│ i...
│--...
│ ...
│ ...
│(2...
│
│PG...
PG=*> COMMIT; │PG...
COMMIT │PG...
PG=> │PG...
│ i...
│--...
│ ...
│ ...
│ ...
│(3...
- Aは1.で取得した行をUPDATEするが、この時点でもBはID:1の...
- AがCOMMIT実行した後に、BはID:1の行を取得できるようにな...
** 参考 [#d077cac0]
https://spin.atomicobject.com/2021/02/04/redis-postgresql/
終了行:
* SKIP LOCKEDを使ったジョブキューイング [#kd5e73b7]
** 1. 最初にAが1行取得する [#ff38e4ed]
Session A │Se...
=====================================================│==...
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...
PG=*> │OC...
PG=*> │BE...
PG=*> │ i...
PG=*> │--...
PG=*> │ ...
PG=*> │ ...
PG=*> │(2...
- Aが'''FOR UPDATE SKIP LOCKED'''を指定してjobsテーブルか...
- BはjobsテーブルからID:1を除いたID:2とID:3の行しかSELECT...
** 2. 次にAが取得した行をUPDATEしてCOMMITする [#ef39c1c4]
PG=*> UPDATE jobs SET status = 'runnnig' WHERE i │PG...
d = 1; │PG...
UPDATE 1 │PG...
PG=*> │PG...
│ i...
│--...
│ ...
│ ...
│(2...
│
│PG...
PG=*> COMMIT; │PG...
COMMIT │PG...
PG=> │PG...
│ i...
│--...
│ ...
│ ...
│ ...
│(3...
- Aは1.で取得した行をUPDATEするが、この時点でもBはID:1の...
- AがCOMMIT実行した後に、BはID:1の行を取得できるようにな...
** 参考 [#d077cac0]
https://spin.atomicobject.com/2021/02/04/redis-postgresql/
ページ名: