GET_LOCK() von MySQL in PostgreSQL?

rkr__

Benutzer
Beiträge
5
Hallo zusammen,

GET_LOCK() ist in der MySQL-/MariaDB-Welt eine elegante Methode, um via Cron gestartete Laufzeiten daran zu hindern, parallel die gleiche Arbeit zu machen. Beispielsweise, wenn man Prozesse hat, die nicht gleichzeitig laufen dürfen, wie beispielsweise Abruf und Persistierung von Amazonbestellungen seit dem letzten Durchgang/Abruf. Die via GET_LOCK() erstellten Locks werden bei Session-Ende, bzw. Verbindungsabbruch automatisch freigegeben.

File-Locking fällt raus, weil diese Prozesse auf mehreren Rechnern gestartet werden können und Redis scheidet aus, weil eine Verbindung zu Redis abreißen könnte, während die Verbindung zu MySQL/MariaDB noch steht.

Bei Postgres gibt es Advisory Locks, die als Namen allerdings keinen String, sondern eine Nummer bekommen. Das ist insofern blöd, als dass man eine Liste führen müsste, welche Applikationen welche Nummern belegen. Da wirkt die GET_LOCK()-Lösung deutlich pragmatischer.

Gibt es etwas Besseres als diese Advisory Locks, oder ist das an dieser Stelle das Beste, was Postgres kann?
 
Werbung:
Ich glaube, ich kann die Frage selbst beantworten. Das Equivalent zu
Code:
GET_LOCK(str name, int timeout)
ist
Code:
pg_try_advisory_lock(bigint id)
. ID kann eine UUID-ähnliche Zufallszahl wie 7241865325823964 sein. Ein
Code:
SELECT pg_try_advisory_lock(7241865325823964)
gibt einem ein bool'schen Wert zurück, der sagt, ob die Lock-ID gerade noch von einem anderen Prozess belegt ist. Das reicht mir soweit als Lösung.
 
Zurück
Oben