Faccio 2 query in una transazione: SELECT (contenente clausola JOIN) e UPDATE. È necessario che i dati nelle righe selezionate non vengano modificati prima dell'aggiornamento, quindi sto utilizzando la clausola FOR UPDATE. La mia domanda è: il "per aggiornamento" funziona solo per una parte dei dati selezionati dalla tabella specificata nella clausola FROM o anche per i dati delle tabelle unite? Il mio DBMS è MySql.Il blocco di righe 'per aggiornamento' funziona anche per le tabelle unite?
9
A
risposta
6
Il documentation dice semplicemente che il blocco è su righe lette senza escludere tabelle unite, quindi dovrebbe essere su tutti i record su tutte le tabelle unite. Se si desidera bloccare solo le righe in una delle tabelle, è possibile farlo separatamente: 'SELEZIONA 1 FROM keytable WHERE ... FOR UPDATE'.
Detto questo, questo non è necessario per impedire semplicemente un aggiornamento tra SELECT e UPDATE. Il blocco di lettura su SELECT lo fa già. Lo scopo di FOR UPDATE sarebbe impedire a un'altra transazione di leggere le righe e quindi potenzialmente causare un deadlock perché non è possibile applicare UPDATE finché l'altra transazione non rilascia il blocco di lettura.
"Detto questo, questo non è necessario per impedire semplicemente un aggiornamento tra SELECT e UPDATE Il blocco di lettura su SELECT già fa questo" Non penso che sia vero. Questo è vero solo se fai SELECT ... LOCK IN SHARE MODE –