Mysql
 sql >> Database >  >> RDS >> Mysql

UPDATE con SELECT, bloccherà ogni riga o tutti i record SELECTed

Il UPDATE è in esecuzione in transazione - è un atomic operazione, il che significa che se una delle righe non riesce (a causa di un vincolo univoco, ad esempio), non aggiornerà nessuna delle 5000 righe. Questa è una delle proprietà ACID di un database transazionale.

Per questo motivo UPDATE mantenere un blocco su tutte le righe per l'intera transazione. Altrimenti un'altra transazione può aggiornare ulteriormente il valore di una riga, in base al suo valore corrente (diciamo che aggiorna i record impostano valore =valore * '2'). Questa istruzione dovrebbe produrre risultati diversi a seconda che la prima transazione venga eseguita o ripristinata. Per questo motivo dovrebbe attendere che la prima transazione completi tutti i 5000 aggiornamenti.

Se vuoi rilasciare i blocchi, esegui l'aggiornamento in batch (più piccoli).

PS autocommit controlla se ogni istruzione viene emessa nella propria transazione, ma non effettua l'esecuzione di una singola query