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

Mysql wybierz do aktualizacji - nie blokuje docelowych wierszy. Jak mogę się upewnić, że tak?

SELECT FOR UPDATE blokuje wiersz wybrany do aktualizacji do czasu zakończenia utworzonej transakcji. Inne transakcje mogą tylko odczytać ten wiersz, ale nie mogą go zaktualizować, dopóki transakcja wyboru do aktualizacji jest nadal otwarta.

Aby zablokować wiersz(e):

START TRANSACTION;
SELECT * FROM test WHERE id = 4 FOR UPDATE;
# Run whatever logic you want to do
COMMIT;

Powyższa transakcja będzie aktywna i zablokuje wiersz, dopóki nie zostanie zatwierdzona.

Aby to przetestować, istnieją różne sposoby. Przetestowałem to przy użyciu dwóch instancji terminala z klientem MySQL otwartym w każdej z nich.

Na first terminal uruchamiasz SQL:

START TRANSACTION;
SELECT * FROM test WHERE id = 4 FOR UPDATE;
# Do not COMMIT to keep the transaction alive

Na second terminal możesz spróbować zaktualizować wiersz:

UPDATE test SET parent = 100 WHERE id = 4;

Ponieważ tworzysz opcję wyboru do aktualizacji na first terminal powyższe zapytanie będzie czekać, aż transakcja wyboru do aktualizacji zostanie zatwierdzona lub przekroczy limit czasu.

Wróć do first terminal i zatwierdź transakcję:

COMMIT;

Sprawdź second terminal i zobaczysz, że zapytanie aktualizacyjne zostało wykonane (jeśli nie upłynął limit czasu).




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Odpowiednik SQLDependency dla MySQL

  2. Dlaczego moja tabela InnoDB ma dziwną wartość liczby rekordów?

  3. Jak zainstalować Ruby on Rails z mysql i uruchomić go, przewodnik krok po kroku?

  4. Uzyskaj ostatnio usunięty identyfikator w MySQL

  5. Zezwalaj użytkownikom tylko na określone informacje z bazy danych