Transazione autonoma in Oracle PL / SQL

โšก Riepilogo intelligente

Dichiarazioni di controllo delle transazioni in Oracle In PL/SQL, in particolare tramite le istruzioni COMMIT, ROLLBACK e SAVEPOINT, si decide se salvare o annullare le modifiche DML in sospeso. Una transazione autonoma viene eseguita come un sottoprogramma indipendente che esegue il commit o il rollback separatamente dalla transazione principale.

  • ๐Ÿ’พ IMPEGNO: Rende permanenti tutte le modifiche DML in sospeso, termina la transazione, rilascia i blocchi ed elimina tutti i punti di salvataggio.
  • ๏ธ RIPRISTINO: Annulla le modifiche in sospeso, sia dell'intera transazione che ripristinano un SAVEPOINT specificato.
  • ???? SAVEPOINT: Segna un punto all'interno di una transazione in modo che un successivo ROLLBACK TO possa annullare solo una parte del lavoro.
  • ๐Ÿ”€ Transazione autonoma: La direttiva PRAGMA AUTONOMOUS_TRANSACTION consente a un sottoprogramma di eseguire il commit o il rollback in modo autonomo.
  • ๐Ÿงพ Casi d'uso: Le transazioni autonome si prestano bene alla registrazione di audit ed errori, che devono persistere anche se l'operazione principale viene annullata.
  • ๐Ÿค– Assistenza AI: Gli assistenti basati sull'intelligenza artificiale, come GitHub Copilot, redigono blocchi COMMIT, ROLLBACK e PRAGMA e segnalano i commit mancanti.

Transazione autonoma in Oracle PL/SQL con COMMIT e ROLLBACK

Cosa sono le istruzioni TCL in PL/SQL?

TCL sta per Transaction Control Statements (Istruzioni di controllo delle transazioni). Queste istruzioni salvano o annullano le transazioni in sospeso. Svolgono un ruolo fondamentale, perchรฉ a meno che una transazione non venga salvata, le modifiche apportate tramite Dichiarazioni DML non verrร  memorizzato in modo permanente nel database. Di seguito sono riportate le diverse istruzioni TCL in PL / SQL.

dichiarazione Descrizione
COMMETTERE Salva tutte le transazioni in sospeso.
RITORNO Annulla tutte le transazioni in sospeso.
PUNTO DI RISPARMIO Crea un punto nella transazione fino al quale รจ possibile annullare l'operazione in un secondo momento.
ROLLBACK A Annulla tutte le transazioni in sospeso fino al punto di salvataggio specificato.

La transazione sarร  completata nei seguenti casi:

  • Quando viene emessa una qualsiasi delle dichiarazioni di cui sopra (ad eccezione di SAVEPOINT).
  • Quando vengono emesse le istruzioni DDL (le DDL sono istruzioni di auto-commit).
  • Quando vengono emesse le istruzioni DCL (le DCL sono istruzioni di auto-commit).

Utilizzo di SAVEPOINT e ROLLBACK TO

La tabella sopra introduce SAVEPOINT e ROLLBACK TO, che insieme ti danno un controllo parziale su una transazione. Un SAVEPOINT contrassegna un punto denominato all'interno della transazione corrente. Un successivo ROLLBACK TO a quel savepoint annulla tutte le modifiche apportate dopo di esso, mentre mantieneping il lavoro svolto in precedenza รจ rimasto intatto.

Questo รจ utile quando una transazione lunga esegue diverse operazioni SQL passaggi e solo l'ultimo passaggio fallisce. Invece di scartare l'intera transazione, puoi tornare all'ultimo punto di salvataggio valido e continuare.

Sintassi:

SAVEPOINT <savepoint_name>;
   -- one or more DML statements
ROLLBACK TO <savepoint_name>;

Punti chiave da ricordare sui punti di salvataggio:

  • Un SAVEPOINT esiste solo all'interno della transazione corrente; un COMMIT o un ROLLBACK completo cancellano tutti i savepoint.
  • Quando si ripristina un punto di salvataggio, tutti i punti di salvataggio creati successivamente vengono cancellati, ma il punto di salvataggio a cui si รจ effettuato il ripristino viene conservato.
  • ROLLBACK TO non termina la transazione; le modifiche apportate prima del punto di salvataggio rimangono in sospeso finchรฉ non si esegue COMMIT o ROLLBACK.
  • Se si riutilizza il nome di un punto di salvataggio, il nuovo punto di salvataggio sposta l'indicatore nella posizione successiva.

Poichรฉ ROLLBACK TO lascia la transazione aperta, alla fine spetta comunque decidere se COMMITARE le modifiche rimanenti o annullarle con un ROLLBACK completo.

Cos'รจ la transazione autonoma

In PL/SQL, tutte le modifiche apportate ai dati sono definite transazioni. Una transazione si considera completata quando viene eseguito un comando di salvataggio (save) o di annullamento (discard). Se non viene eseguito alcun comando di salvataggio o annullamento, la transazione non si considera completata e le modifiche apportate ai dati non saranno permanenti sul server.

Per impostazione predefinita, PL/SQL considera tutte le modifiche apportate durante una sessione come un'unica transazione, e il salvataggio o l'annullamento di tale transazione influisce su tutte le modifiche in sospeso nella sessione. Una transazione autonoma offre allo sviluppatore la possibilitร  di apportare modifiche in una transazione separata e di salvare o annullare tale transazione specifica senza influire sulla transazione principale della sessione.

  • A livello di sottoprogramma รจ possibile specificare una transazione autonoma.
  • Per farne qualcuno sottoprogramma Se si lavora in una transazione diversa, la parola chiave PRAGMA AUTONOMOUS_TRANSACTION deve essere specificata nella sezione dichiarativa di tale blocco.
  • Questo comando indica al compilatore di trattare questa operazione come una transazione separata, e il salvataggio o l'eliminazione all'interno di questo blocco non si rifletteranno nella transazione principale.
  • L'esecuzione di COMMIT o ROLLBACK รจ obbligatoria prima di uscire da questa transazione autonoma e tornare alla transazione principale, poichรฉ in un dato momento puรฒ essere attiva una sola transazione.
  • Pertanto, una volta avviata una transazione autonoma, questa deve essere salvata e completata prima che il controllo possa tornare alla transazione principale.

Sintassi:

DECLARE
PRAGMA AUTONOMOUS_TRANSACTION;
.
BEGIN
<execution_part>
[COMMIT|ROLLBACK]
END;
/

Nella sintassi sopra riportata, il blocco รจ stato reso una transazione autonoma.

Esempio 1: In questo esempio, capiremo come funziona una transazione autonoma.

Lo screenshot qui sotto mostra questo esempio di transazione autonoma e il suo output in Oracle.

Esempio di transazione autonoma che esegue il commit di un blocco nidificato mentre la transazione principale viene annullata Oracle PL / SQL

DECLARE
   l_salary   NUMBER;
   PROCEDURE nested_block IS
   PRAGMA autonomous_transaction;
    BEGIN
     UPDATE emp
       SET salary = salary + 15000
       WHERE emp_no = 1002;
   COMMIT;
   END;
BEGIN
   SELECT salary INTO l_salary FROM emp WHERE emp_no = 1001;
   dbms_output.put_line('Before Salary of 1001 is'|| l_salary);
   SELECT salary INTO l_salary FROM emp WHERE emp_no = 1002;
   dbms_output.put_line('Before Salary of 1002 is'|| l_salary);    
   UPDATE emp 
   SET salary = salary + 5000 
   WHERE emp_no = 1001;

nested_block;
ROLLBACK;

 SELECT salary INTO  l_salary FROM emp WHERE emp_no = 1001;
 dbms_output.put_line('After Salary of 1001 is'|| l_salary);
 SELECT salary INTO l_salary FROM emp WHERE emp_no = 1002;
 dbms_output.put_line('After Salary of 1002 is '|| l_salary);
end;

Uscita

Before:Salary of 1001 is 15000 
Before:Salary of 1002 is 10000 
After:Salary of 1001 is 15000 
After:Salary of 1002 is 25000

Code Spiegazione:

  • Code riga 2: Dichiarazione di l_salary come NUMERO.
  • Code riga 3: Dichiarazione della procedura nested_block.
  • Code riga 4: Trasformare la procedura nested_block in una AUTONOMOUS_TRANSACTION.
  • Code righe 7-9: Aumento dello stipendio del dipendente numero 1002 di 15000.
  • Code riga 10: Esecuzione della transazione autonoma.
  • Code righe 13-16: Stampa dei dettagli salariali dei dipendenti 1001 e 1002 prima delle modifiche.
  • Code righe 17-19: Aumento dello stipendio del dipendente numero 1001 di 5000.
  • Code riga 20: Chiamata alla procedura nested_block.
  • Code riga 21: Scartare la transazione principale.
  • Code righe 22-25: Stampa dei dettagli salariali dei dipendenti 1001 e 1002 dopo le modifiche.

L'aumento salariale per il dipendente numero 1001 non viene visualizzato perchรฉ la transazione principale รจ stata scartata. L'aumento salariale per il dipendente numero 1002 viene invece visualizzato perchรฉ tale blocco di dati รจ stato reso una transazione separata e salvato alla fine.

Pertanto, indipendentemente dal salvataggio o dall'annullamento nella transazione principale, le modifiche nella transazione autonoma vengono salvate senza influire sulla transazione principale.

Quando utilizzare le transazioni autonome

Le transazioni autonome sono potenti, quindi รจ utile sapere quando utilizzarle. Riservatele alle operazioni che devono avere successo o fallire indipendentemente dalla transazione principale, non alla logica di business fondamentale. Esempi di utilizzo comuni includono:

  • Registrazione di controllo: Registra chi ha modificato i dati sensibili, quando e i valori vecchi e nuovi, in modo che il registro rimanga disponibile anche se la transazione principale viene annullata.
  • Registrazione degli errori: Scrivi un record di errore all'interno di un eccezione gestore e COMMIT it, in modo che i dettagli diagnostici vengano conservati mentre la transazione fallita viene scartata.
  • Contatori e statistiche: Aumenta un contatore di utilizzo o di accessi che deve persistere indipendentemente dall'esito della chiamata.
  • COMMIT all'interno di un trigger: Un trigger non puรฒ emettere COMMIT direttamente; una transazione autonoma รจ l'unico modo supportato per farlo.

Evitate le transazioni autonome per gli aggiornamenti ordinari che dovrebbero condividere il destino della transazione principale. Un uso eccessivo puรฒ nascondere i dati dietro commit indipendenti e rendere piรน difficile il debug. Come regola generale, ogni blocco autonomo deve terminare con un COMMIT o un ROLLBACK esplicito.

Transazioni autonome vs. transazioni regolari

La differenza tra una transazione ordinaria (principale) e una transazione autonoma risiede nella portata e nell'indipendenza. La tabella seguente le confronta.

Aspetto Transazione regolare Transazione autonoma
Obbiettivo Condivide una transazione di sessione Viene eseguita come transazione secondaria separata
Effetto COMMIT / ROLLBACK Influisce su tutte le modifiche di sessione in sospeso Influisce solo sul blocco autonomo
Dichiarazione Comportamento predefinito PRAGMA AUTONOMOUS_TRANSACTION nella sezione dichiarativa
Effetto del rollback del genitore Le modifiche si perdono Le modifiche autonome impegnate vengono mantenute
Utilizzo tipico Logica aziendale fondamentale Registrazione degli errori e delle verifiche

A differenza di un normale blocco annidatoMentre un blocco principale, le cui modifiche condividono sempre l'esito della transazione che lo contiene, รจ un blocco autonomo indipendente. Comprendere questa differenza aiuta a decidere quando un blocco deve essere indipendente e quando deve condividere il risultato della transazione principale.

DOMANDE FREQUENTI

Oracle Genera l'errore ORA-06519 e annulla l'operazione autonoma. Ogni transazione autonoma deve terminare con un COMMIT o un ROLLBACK esplicito prima che il controllo ritorni alla transazione principale, poichรฉ รจ consentita una sola transazione attiva alla volta.

Non direttamente. Un trigger normale non puรฒ emettere COMMIT o ROLLBACK. Dichiarare il trigger, o una procedura da esso chiamata, con PRAGMA AUTONOMOUS_TRANSACTION consente di eseguire il commit delle proprie modifiche indipendentemente dall'istruzione che ha attivato il trigger.

No. Una volta sospesa la transazione padre, la transazione autonoma viene eseguita in modo indipendente e non puรฒ visualizzare le modifiche non ancora confermate della transazione padre. Visualizza solo i dati giร  confermati nel database, pertanto l'attesa di un blocco da parte della transazione padre puรฒ causare un deadlock.

Sรฌ. Ogni istruzione DDL, come CREATE, ALTER o DROP, emette un COMMIT implicito prima e dopo l'esecuzione. Qualsiasi operazione DML in sospeso nella sessione viene confermata automaticamente, quindi un'istruzione DDL non puรฒ essere annullata in seguito.

Un blocco autonomo puรฒ richiamarne un altro, e ciascuno gestisce autonomamente le proprie operazioni di COMMIT o ROLLBACK. Oracle Il parametro di inizializzazione TRANSACTIONS limita il numero di transazioni attive contemporaneamente, pertanto un annidamento molto profondo di blocchi autonomi potrebbe non funzionare.

No. Un COMMIT rende permanenti le modifiche, rilascia i blocchi ed elimina i punti di salvataggio, quindi non puรฒ essere annullato con ROLLBACK. Per annullare i dati confermati รจ necessario eseguire una nuova operazione DML. Utilizzare SAVEPOINT e ROLLBACK TO per un annullamento parziale prima del commit.

Sรฌ. Le serrature scorrevoli portatili e i catenacci a superficie possono essere usati per mettere in sicurezza una porta a scomparsa dall'esterno. Alcuni kit con catena di sicurezza consentono anche il bloccaggio esterno con chiave o manopola girevole. Copilota GitHub Bozze della logica COMMIT e ROLLBACK, blocchi SAVEPOINT e procedure PRAGMA AUTONOMOUS_TRANSACTION da un commento. RevEsaminare il posizionamento del commit e la gestione degli errori, poichรฉ un commit posizionato in modo errato puรฒ compromettere i confini della transazione.

Gli assistenti basati sull'intelligenza artificiale analizzano le procedure alla ricerca di istruzioni COMMIT e ROLLBACK mancanti o posizionate in modo errato, commit all'interno di cicli e blocchi autonomi non chiusi. Questa revisione basata sull'apprendimento automatico individua i bug relativi alle transazioni e suggerisce limiti piรน sicuri prima che il codice raggiunga la produzione.

Riassumi questo post con: