Saat melakukan transaksi lintas basis data, di mana log transaksi mana informasi tersebut disimpan?

9

Diberikan cuplikan berikut:

-- error checking omitted for brevity
begin tran

exec database1..my_stored_procedure
exec database2..my_other_stored_procedure

if (@@error <> 0)
  rollback

commit

Ke dalam log transaksi basis data manakah informasi transaksional akan dimasukkan?

Saya berharap kedua log akan mendapatkan semua data, karena tidak masuk akal jika Anda mencoba untuk memutar ulang database1log transaksi dan hanya mempengaruhi DB itu. Saya juga berharap Anda tidak dapat memutar ulang database1transaksi transaksi di server database2yang tidak ada, dan sebaliknya.

.. tapi saya terbuka untuk koreksi!

Ian Kemp
sumber

Jawaban:

13

Log transaksi tidak merekam pernyataan SQL yang sedang dieksekusi, seperti yang mungkin Anda harapkan. Sebagai gantinya, itu merekam perubahan ke data mentah di setiap database, secara independen.

Ada kemungkinan untuk proc yang disimpan dari satu basis data bekerja sepenuhnya dalam log transaksi dari basis data lain.

... 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

Atau untuk itu membuat perubahan pada keduanya.

... 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

Apa yang dicatat dalam log transaksi adalah perubahan data aktual , bukan pernyataan SQL yang menyebabkannya terjadi. Entri untuk setiap file log transaksi sepenuhnya independen, kecuali sejauh KOMIT ditulis ke dua file log pada saat yang sama, setelah transaksi dilakukan.

Logika yang sama berlaku jika Anda memiliki transaksi yang lebih besar menjalankan sejumlah prosedur tersimpan di banyak basis data. Setelah Anda KOMIT transaksi Anda, KOMIT akan dicatat dalam log setiap basis data yang berpartisipasi dalam transaksi.

Sangat mungkin untuk memulihkan cadangan database2, dan memutar ulang log transaksinya pada server yang tidak memiliki database1.

Perilaku ini memungkinkan beberapa fleksibilitas dalam bagaimana prosedur dan pandangan ditata dalam SQL Server. Banyak administrator basis data menyimpan prosedur yang tersimpan - terutama yang pemeliharaan - dalam basis data (mis. Admin) Yang benar-benar terpisah dari basis data aplikasi / pengguna, dan menuliskan hasil operasi pemeliharaan ke basis data tersebut. Untungnya, dimungkinkan untuk mengembalikan salah satu database pengguna ke server pengembangan tanpa perlu menyalin Adminjuga.

Nathan Jolly
sumber