Silnik: InnoDB company_id jest kluczem podstawowym w tym przypadku. Po uruchomieniu następującego sql, blokuje tylko wiersze, które są wybrane:
select * from company where company_id = 1 for update
=> 1 wiersz zablokowany
select * from company where company_id in (1, 2) for update
=> 2 wiersze zablokowane
Ale gdy liczba warunków zwiększy się do pięciu, sqls wyglądają tak, zablokuje cały stół:
SELECT
*
FROM
company
WHERE
company_id = 1
OR company_id = 2
OR company_id = 3
OR company_id = 4
OR company_id = 5
FOR UPDATE
=> tabela zablokowana
SELECT
*
FROM
company
WHERE
company_id IN (1, 2, 3, 4, 5)
FOR UPDATE
=> tabela zablokowana
Czy istnieje sposób blokowania wielu rekordów za pomocą tylko jednego zapytania (z wieloma warunkami)?
=================== PYTANIE NAPRAWIONE ============================= =
Przykro mi, że przegapiłem "aktualizację" podczas pierwszej edycji pytania.
Odpowiedzi:
1 dla odpowiedzi № 1Nie sądzę, że polecenie select zablokuje wybrane wiersze. Według dokumentu https://dev.mysql.com/doc/refman/5.7/en/innodb-locking-reads.htmlNależy użyć polecenia WYBIERZ ... DO AKTUALIZACJI, aby zablokować wiersze.