2016-09-05 1 views
0

Ich habe einen Strom von Ereignissen der Benutzererstellung und Benutzeraktualisierungen.MEMSQL - UPSERT IF (Versionierung von Datensätzen)

Jedes Ereignis enthält den Ereignistyp (Erstellung oder Aktualisierung) und die gesamte Benutzereinheit, z 1 etc ..

die Ereignisse sind nicht unbedingt bestellt, damit ich Version bekommen könnte 2 vor Version 1 UND auch sie können parallel verarbeitet werden, so dass, während ich versuche Version zu anhalten 1 die anderen Ereignisse Prozessor streamen (s) versucht in paralleler Version 2 zu bestehen.

Ich möchte UPSERT mit atomarer Bedingung (IF) so durchführen, dass eine erfolgreiche Aktualisierung nur dann erfolgt, wenn VERSION_IN_DB < NEW_VERSION_IM_TRYING_TO_UPDATE. Wenn die Datenbank keine Version enthält, fügen Sie einfach den Benutzerdatensatz ein. (Atom auch)

Dies alles soll darauf achten, dass nur die neueste Version des Benutzers wird in allen Fällen beibehalten werden - multi-threaded, ungeordneter Ereignisstrom etc ..

Jede Idee, wie kann ich tun es mit MEMSQL?

Antwort

2

So etwas sollte funktionieren:

INSERT INTO <table> VALUES (...) ON DUPLICATE KEY UPDATE 
    col = IF(VALUES(version) > version, VALUES(col), col), 
    <repeat for other columns>, 
    version = IF(VALUES(version) > version, VALUES(version), version) 

ganze Logik in der ON DUPLICATE Klausel KEY UPDATE läuft atomar (und sonst niemand diese Zeile ändern kann, bis die Transaktion mit dem INSERT verpflichtet).