Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Konsument producenta MySQL z wieloma wybranymi wątkami

Mam dla Ciebie praktyczne rozwiązanie, które widziałem w projekcie w swoim miejscu pracy. Zamiast używać tylko 0 i 1 dla niekompletnych i wypełnionych, rozszerz swój zestaw, aby zawierał więcej przypadków.

Nazwijmy tę kolumnę stanem . Oto różne wartości tej kolumny i odpowiadające im stany zadania.

  1. Gdy status wynosi 0, zadanie nie zostało odebrane przez żaden wątek roboczy.
  2. Gdy status wynosi 1, zadanie zostało odebrane przez wątek roboczy i jest w trakcie przetwarzania.
  3. Gdy status wynosi 2, zadanie nie powiodło się. (Powinieneś rozważyć możliwość niepowodzenia przetwarzania.)
  4. Gdy status wynosi 3, zadanie zostało ukończone.

Twoje wątki powinny zawierać logikę w taki sposób, aby pobierała tylko zadania, których status wynosi 0 i zmieniała status na 1. To uniemożliwi innym wątkom pobieranie tych zadań, które są w trakcie przetwarzania. Po zakończeniu zadania status jest ustawiany na 3, a jeśli zadanie się nie powiedzie, status jest ustawiany na 2. Następnie wątek może przejść dalej i poszukać innego zadania, które nie zostało jeszcze ukończone.

Możesz również poprosić wątki o rozważenie wybrania zadań o statusie 2, ale będziesz musiał zdefiniować logikę, aby określić skończoną liczbę ponownych prób.

EDYTUJ:

Po długiej dyskusji , wspólnie natknęliśmy się na rozwiązanie. Moja powyższa odpowiedź jest dobra w bardziej uogólnionym stanie, gdy „praca” jest procesem, który zajmuje trochę czasu. Ale tak nie było w przypadku PO.

Rozwiązanie, które ostatecznie zadziałało, było następujące:

BEGIN 
SELECT * FROM Jobs WHERE JobID = (SELECT * FROM Jobs WHERE completed = 0 LIMIT 1) LOCK IN SHARE MODE;
UPDATE Jobs SET completed = 1 WHERE JobID = (PREVIOUS ID); 
COMMIT;



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak uzyskać identyfikator po wstawieniu do bazy danych MySQL za pomocą Pythona?

  2. Mysql FIND_IN_SET w klauzuli gdzie

  3. Unikalny kod oparty na unikalnym adresie e-mail w tabeli mysql?

  4. jdbc4.MySQLSyntaxErrorException:Tabela nie istnieje w bazie danych

  5. jak obejść BŁĄD 1045 (28000):Odmowa dostępu dla użytkownika 'ODBC'@'localhost' (przy użyciu hasła:NIE) na stałe