Quando si esegue una transazione tra database, in quale registro (i) delle transazioni vengono archiviate le informazioni?


9

Dato il seguente frammento:

-- error checking omitted for brevity
begin tran

exec database1..my_stored_procedure
exec database2..my_other_stored_procedure

if (@@error <> 0)
  rollback

commit

In quali log delle transazioni del database verranno inserite le informazioni transazionali?

Mi aspetto che entrambi i registri ottengano tutti i dati, dal momento che non avrebbe senso se si tentasse di riprodurre database1nuovamente il registro delle transazioni e influisse solo su quel DB. Mi aspetto anche che non saresti in grado di riprodurre database1il registro delle transazioni su un server dove database2non era presente, e viceversa.

.. ma sono aperto a correzioni!

Risposte:


13

Il registro delle transazioni non registra le istruzioni SQL in esecuzione, come ci si potrebbe aspettare. Invece, sta registrando le modifiche ai dati grezzi in ciascun database, indipendentemente.

È possibile che un proc memorizzato da un database funzioni interamente nel registro delle transazioni di un altro database.

... database1..my_stored_procedure AS 
BEGIN
INSERT INTO database2..table1 (col1) values (1);
  ^^ changes written to database2's tlog
INSERT INTO database2..table2 (col1) values (2);
  ^^ changes written to database2's tlog
END
^^ when this transaction is committed, COMMIT is recorded in database2's tlog

O per fare modifiche ad entrambi.

... database2..my_other_stored_procedure AS 
BEGIN
INSERT INTO database1..table1 (col1) values (1);
  ^^ changes written to database1's tlog
INSERT INTO database2..table1 (col1) values (2);
  ^^ changes written to database2's tlog
END
^^ when this transaction is committed, COMMIT is recorded in BOTH database1's and database2's tlog

Ciò che è registrato nel registro delle transazioni sono le effettive modifiche ai dati , non le istruzioni SQL che le hanno provocate. Le voci per ciascun file di registro delle transazioni sono completamente indipendenti, tranne nella misura in cui COMMIT viene scritto nei due file di registro contemporaneamente, una volta che la transazione viene impegnata.

La stessa logica si applica se si dispone di una transazione più ampia che esegue una serie di procedure memorizzate su più database. Dopo aver COMMITATO la transazione, COMMIT verrà registrato nel registro di ogni database che ha partecipato alla transazione.

È perfettamente possibile ripristinare un backup di database2 e riprodurre i registri delle transazioni su un server che non dispone di database1.

Questo comportamento consente una certa flessibilità nel modo in cui le procedure e le viste sono disposte in SQL Server. Molti amministratori di database conservano le loro procedure memorizzate, in particolare quelle di manutenzione, in un database (ad esempio Admin) completamente separato dai database di applicazioni / utenti e scrivono i risultati dell'operazione di manutenzione su quel database. Per fortuna, è possibile ripristinare uno dei database utente su un server di sviluppo senza la necessità di copiarlo Admin.

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.