2016-09-18 1 views
1

Ich entwickle ein Call-Center-IVR-System mit starkem Verkehr. Ich möchte jedem Anrufer einen zufälligen FREIEN Vertreter geben, mit dem er sich unterhalten kann.MySQL Block Auswahl/Lesen einer bestimmten Zeile

Was ich jetzt tun ist:

SELECT admin FROM admins WHERE live = 1 AND available = 1 ORDER BY RAND() LIMIT 1 

Nachdem ich die freien Vertreter bekommen, ich aktualisiere ihn so nicht verfügbar sein:

UPDATE admins SET available = 0 WHERE admin = XXX 

Nach dieser Prüfung bemerkte ich als Anrufer manchmal beenden mit dem gleichen Vertreter zur gleichen Zeit, wenn sie fast zur gleichen Zeit anrufen.

Ich habe versucht, "FOR UPDATE" zu der Select-Abfrage hinzuzufügen, aber es hilft nicht wirklich beim Sperren der Zeile für die Auswahl.

Eine Idee, wie kann dieses Problem angegangen werden?

Antwort

1

Dies wird als Race-Bedingung bezeichnet. Eine Methode ist, die Tabelle zu sperren, aber das kann die Dinge verlangsamen. Eine weitere Idee ist es, das Update zu tun, und die ID zugleich holen:

UPDATE admins 
    SET available = if(@id := admin, 0, 0) 
    WHERE live = 1 AND available = 1 
    ORDER BY RAND() 
    LIMIT 1; 

SELECT @id; 

Dies wird die id der betroffenen Zeile zurück.

Verwandte Themen