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:
-
COPYcomandi, che eseguono carichi (iniziali o incrementali)
-
INSERTcomandi che aggiungono una o più righe alla volta
-
UPDATEcomandi, che modificano le righe esistenti
-
DELETEcomandi, che rimuovono le righe
COPYe INSERT le operazioni sono operazioni di pura scrittura, ma DELETE le UPDATE operazioni 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. COPYe INSERT le operazioni sulla stessa tabella vengono mantenute in stato di attesa fino al rilascio del blocco, quindi procedono normalmente.
UPDATEe DELETE le operazioni si comportano in modo diverso perché si basano su una tabella iniziale letta 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 comando DELETE rilascia il blocco, il secondo UPDATE DELETE deve determinare se i dati con cui intende lavorare 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. DML