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

Unikaj martwego zamka, zamawiając wyraźnie

Chociaż możesz to zrobić przez straight_join, możesz również jawnie uzyskać blokady w żądanych wierszach, powielając opcję select ...for update w tym, który chcesz uzyskać jako pierwszy.

CREATE TEMPORARY TABLE colorsToUpdate (
     colorID BIGINT(20) NOT NULL, 
     modelID BIGINT(20) NOT NULL
);

insert into colorsToUpdate ( colorID, modelID)
SELECT  id, model_id
FROM    colors
where id in (101, 105, 106);

#This will try to acquire lock on models
select m.* from models m
join colorsToUpdate c
on c.modelID = m.id
for UPDATE;

#this will try to get locks on models, and colors.
select m.*, c.*
from colorsToUpdate u
left join models m
on u.modelID = m.id
join colors c 
on u.colorID = c.ID
order by m.id asc, c.id asc
for update;

# do your data modification here.

drop table colorsToUpdate;

Ponieważ blokowanie odbywa się w wielu krokach, możliwe byłoby modyfikowanie wpisów w tabeli 'colors' pomiędzy ustawieniem tabeli tymczasowej a zakończeniem uzyskiwania blokad na dwóch tabelach.

To może być dla ciebie w porządku (tj. jeśli chcesz tylko zmodyfikować istniejące wpisy, kiedy rozpocznie się transakcja), ale może spowodować subtelne błędy, jeśli nie tego chcesz.




  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 klucza obcego MySQL 1005 errno 150 klucz podstawowy jako klucz obcy

  2. złącze mariadb J Aurora Szybka implementacja przełączania awaryjnego

  3. Połączenie MySQL nie działa:2002 Brak takiego pliku lub katalogu

  4. Wybierz inkrementowaną liczbę całkowitą

  5. SQL:Jak wybrać jeden rekord na dzień, zakładając, że każdy dzień zawiera więcej niż 1 wartość MySQL