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

mysql - Blokowanie wierszy dla zapytania wybierającego?

Natywne blokowanie MySQL nie zapewnia tej funkcjonalności. Możesz użyć kolumny do wykonania swoich "blokad".

Zakładając, że każdy wątek miał unikalny identyfikator, możesz utworzyć kolumnę o nazwie thread_owner , domyślnie 0.

Jeden wątek chwyciłby wiersz w ten sposób:

UPDATE mytable
SET thread_owner = :my_threadID
WHERE thread_owner = 0
LIMIT 1

Następnie wybierz wiersz w ten sposób (może zwrócić brak, jeśli nie ma wierszy do przetworzenia):

SELECT *
FROM mytable
WHERE thread_owner = :my_threadID

Następnie przetwórz i na koniec usuń.

To rozwiązanie działałoby zarówno na MyISAM, jak i InnoDB.

Jednak w przypadku InnoDB może to być powolne, ponieważ każda instrukcja UPDATE próbuje zablokować wszystkie wiersze, w których właściciel_wątku =0, i jeśli nie masz pewności, że blokujesz wszystkie wiersze za każdym razem w tej samej kolejności, może to nawet spowodować zakleszczenie. Możesz więc spróbować jawnie zablokować całą tabelę w instrukcji UPDATE:

LOCK TABLES mytable WRITE;
UPDATE mytable
SET thread_owner = :my_threadID
WHERE thread_owner = 0
LIMIT 1;
UNLOCK TABLES;

W ten sposób zarówno MyISAM, jak i InnoDB będą działać w ten sam sposób.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. mysql order by rand() problem z wydajnością i rozwiązanie

  2. Połączenie MySQL RDS i JDBC SSL daje błąd:nie można znaleźć prawidłowej ścieżki certyfikacji do żądanego celu

  3. mysql połączone unikalne klucze

  4. laravel zapytanie php jak uzyskać maksymalną wartość w zakresie

  5. Chart.js - Pobieranie danych z bazy danych za pomocą mysql i php