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

MySQL Select... do aktualizacji z indeksem ma problem ze współbieżnością

Z czysto teoretycznego punktu widzenia wygląda na to, że nie blokujesz właściwych wierszy (inny warunek w pierwszej instrukcji niż w instrukcji update; poza tym blokujesz tylko jeden wiersz z powodu LIMIT 1 , podczas gdy później prawdopodobnie zaktualizujesz więcej wierszy).

Spróbuj tego:

START TRANSACTION;
SELECT v_id FROM v_ext WHERE username IS NULL AND v_id=yyy FOR UPDATE;
UPDATE v_ext SET username=xxx WHERE v_id=yyy;
COMMIT;

[edytuj]

Jeśli chodzi o przyczynę twojego impasu, to jest to prawdopodobna odpowiedź (z instrukcji ):

Bez indeksu SELECT ... FOR UPDATE Instrukcja prawdopodobnie zablokuje całą tabelę, podczas gdy z indeksem blokuje tylko niektóre wiersze. Ponieważ nie zablokowałeś właściwych wierszy w pierwszej instrukcji, dodatkowa blokada jest uzyskiwana podczas drugiej instrukcji.

Oczywiście zakleszczenie nie może nastąpić, jeśli cała tabela jest zablokowana (tj. bez indeksu). Zakleszczenie z pewnością może wystąpić w drugiej konfiguracji.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Błąd MYSQL:1045 (28000):Odmowa dostępu dla użytkownika „root”@„localhost”

  2. Mysql varchar unikalna kolumna varchar(255) vs. varchar(50)

  3. Dlaczego mój wynik jest duplikowany podczas korzystania z podzapytania?

  4. Jak uzyskać kolejny rekord w zbiorze wyników mysql?

  5. Błąd składni MySQL w instrukcji WHILE