Inserimento di un'istruzione Select in una transazione


10

Qual è la differenza tra queste 2 query:

START TRANSACTION;
SELECT * FROM orders WHERE id=1;
UPDATE orders SET username='John' WHERE id=1;
COMMIT;

E senza transazione:

SELECT * FROM orders WHERE id=1;
UPDATE orders SET username='John' WHERE id=1;  

Qual è l'effetto di avere SELECTuna transazione interna?

Se è DELETE FROM orders WHERE id=1stato chiamato da un'altra sessione subito dopo SELECTin entrambi i casi, quando verrà elaborato?

Risposte:


5

Una query SELECT all'interno di una transazione, di per sé, non è adeguatamente protetta da UPDATE e DELETE.

Di cosa hai bisogno per usare quanto segue:

In caso di problemi Delete From orders Where id=1, accadrà una volta che le righe nella orderstabella avranno rilasciato i loro blocchi alla fine della transazione. Potresti sperimentare (su un Dev / Staging Server, per favore) con l'utilizzo del READ UNCOMMITTEDlivello di isolamento della transazione per far sì che l'eliminazione avvenga logicamente, ma solo durante il commit diventerà visibile e registrata in modo permanente.

Nella seconda transazione, praticamente tutte le scommesse sono disattivate. Se corri

select * From orders Where id=1;
UPDATE orders SET username="John" Where id=1;

la corsa Delete From orders Where id=1si impegnerà immediatamente. A seconda dell'ordine in cui MySQL esegue queste istruzioni, vedrai (o non vedrai) le righe di eliminazione.

AVVERTIMENTO

MySQL 5.6 ora include :

  • START TRANSACTION READ WRITE;
  • START TRANSACTION READ ONLY;

I modificatori READ WRITE e READ ONLY impostano la modalità di accesso alla transazione. Consentono o vietano le modifiche alle tabelle utilizzate nella transazione. La limitazione LEGGI SOLO impedisce alla transazione di modificare o bloccare le tabelle transazionali e non transazionali che sono visibili ad altre transazioni; la transazione può ancora modificare o bloccare le tabelle temporanee. Questi modificatori sono disponibili a partire da MySQL 5.6.5.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.