Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Select... order by id desc limit 1 for update
- Users
- -----------------------------------------
- ID | Name | flags
- -----------------------------------------
- 1 | bob | 0
- 2 | fred | 1
- 3 | tom | 0
- 4 | ed | 0
- select * from queue where flag=0 order by id desc for update;
- update queue set flag=1 where id=:id;
- --if you really want the lock:
- select * from queue where id=:id for update;
- ...
- Select... order by id desc offset THREAD_NUMBER limit 1 for update
- UPDATE users SET flags = 1 WHERE id = ( SELECT id FROM users WHERE flags = 0 ORDER BY id DESC LIMIT 1 ) RETURNING ...;
- SELECT ... WHERE FLAG=0 ... FOR UPDATE
- UPDATE ... SET FLAG=1 WHERE ID=:id
- select *
- into l_sms
- from sms
- where prefix_id = l_prefix_id
- and invoice_id is null
- and pg_try_advisory_lock(sms_id)
- order by suffix
- limit 1;
- Users
- -----------------------------------
- ID | Name | flags
- -----------------------------------
- 1 | bob | 0
- 2 | fred | 1
- 3 | tom | 0
- 4 | ed | 0
- BEGIN;
- UPDATE "Users"
- SET ...
- WHERE ...;
- RETURNING ( column list );
- COMMIT;
- FOR messages in select * from public.messages where sendTime >= CURRENT_TIMESTAMP - '1 SECOND'::INTERVAL AND sendTime <= CURRENT_TIMESTAMP + '1 SECOND'::INTERVAL AND sent is FALSE FOR UPDATE LOOP
- -- DO SMTH
- END LOOP;
- FOR messages in select * from public.messages where sendTime >= CURRENT_TIMESTAMP - '1 SECOND'::INTERVAL AND sendTime <= CURRENT_TIMESTAMP + '1 SECOND'::INTERVAL AND sent is FALSE AND is_locked(msg_id) IS FALSE FOR SHARE LOOP
- -- DO SMTH
- END LOOP;
- CREATE OR REPLACE FUNCTION is_locked(integer) RETURNS BOOLEAN AS $$
- DECLARE
- id integer;
- checkout_id integer;
- is_it boolean;
- BEGIN
- checkout_id := $1;
- is_it := FALSE;
- BEGIN
- -- we use FOR UPDATE to attempt a lock and NOWAIT to get the error immediately
- id := msg_id FROM public.messages WHERE msg_id = checkout_id FOR UPDATE NOWAIT;
- EXCEPTION
- WHEN lock_not_available THEN
- is_it := TRUE;
- END;
- RETURN is_it;
- END;
- $$ LANGUAGE 'plpgsql' VOLATILE COST 100;
Add Comment
Please, Sign In to add comment