Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.
Operazioni di scrittura e lettura/scrittura
È possibile gestire il comportamento specifico delle operazioni simultanee di scrittura decidendo quando e come eseguire diversi tipi di comandi. I seguenti comandi sono rilevanti a tal riguardo:
-
Comandi COPY, che eseguono caricamenti (iniziali o incrementali)
-
Comandi INSERT, che aggiungono una o più righe alla volta
-
Comandi UPDATE, che modificano le righe esistenti
-
Comandi DELETE, che rimuovono le righe esistenti
Le operazioni COPY e INSERT sono operazioni di scrittura pure, ma le operazioni DELETE e UPDATE sono operazioni di lettura/scrittura. Per poter essere eliminate o aggiornate, le righe devono prima essere lette. I risultati delle operazioni di scrittura simultanee dipendono dai comandi specifici che vengono eseguiti simultaneamente. Le operazioni di COPY e INSERT sulla stessa tabella vengono mantenute in uno stato di attesa fino al rilascio del blocco, quindi procedono normalmente.
Le operazioni di UPDATE e DELETE si comportano in modo diverso perché si basano su una tabella iniziale prima di eseguire qualsiasi scrittura. Dato che le transazioni simultanee sono invisibili l'una all'altra, entrambe UPDATEs DELETEs devono leggere un'istantanea dei dati dell'ultimo commit. Quando il primo UPDATE o DELETE rilascia il suo blocco, il secondo UPDATE o DELETE deve determinare se i dati con cui lavorerà sono potenzialmente obsoleti. Non saranno obsoleti, perché la seconda transazione non ottiene la sua snapshot di dati fino a quando la prima transazione non ha rilasciato il blocco.
Potenziale situazione di deadlock per le transazioni di scrittura simultanee
Ogni volta che le transazioni comportano aggiornamenti di più di una tabella, esiste sempre la possibilità di eseguire simultaneamente le transazioni in deadlock quando entrambe cercano di scrivere sullo stesso set di tabelle. Una transazione rilascia tutti i blocchi della tabella in una sola volta quando esegue il commit o il rollback; non rilascia i blocchi uno alla volta.
Ad esempio, supponiamo che le transazioni simultanee, T1 e T2 inizino circa nello stesso momento. Se T1 inizia a scrivere sulla tabella A e T2 inizia a scrivere sulla tabella B, entrambe le transazioni possono procedere senza conflitto; tuttavia, se T1 finisce di scrivere sulla tabella A e deve iniziare a scrivere sulla tabella B, non sarà in grado di procedere perché T2 mantiene ancora il blocco su B. Al contrario, se T2 finisce di scrivere sulla tabella B e deve iniziare a scrivere sulla tabella A, non sarà in grado di procedere perché T1 mantiene ancora il blocco su A. Poiché nessuna transazione può rilasciare i blocchi finché tutte le operazioni di scrittura non vengono eseguite, l'altra transazione non può procedere.
Per evitare questo tipo di deadlock, è necessario pianificare attentamente le operazioni di scrittura simultanee. Ad esempio, è necessario aggiornare sempre le tabelle nello stesso ordine nelle transazioni e, se si specificano i blocchi, bloccare le tabelle nello stesso ordine prima di eseguire qualsiasi operazione di DML.