Khi thực hiện giao dịch cơ sở dữ liệu chéo, trong đó (các) nhật ký giao dịch là thông tin được lưu trữ?


9

Đưa ra đoạn trích sau:

-- error checking omitted for brevity
begin tran

exec database1..my_stored_procedure
exec database2..my_other_stored_procedure

if (@@error <> 0)
  rollback

commit

Thông tin giao dịch sẽ được chèn vào cơ sở dữ liệu nào?

Tôi hy vọng cả hai nhật ký sẽ nhận được tất cả dữ liệu, vì sẽ không có ý nghĩa nếu bạn cố phát lại database1nhật ký giao dịch và nó chỉ ảnh hưởng đến DB đó. Tôi cũng mong rằng bạn sẽ không thể phát lại database1nhật ký giao dịch trên máy chủ database2không có mặt và ngược lại.

.. nhưng tôi đang mở để sửa chữa!

Câu trả lời:


13

Nhật ký giao dịch không ghi lại các câu lệnh SQL đang được thực thi, như bạn có thể mong đợi. Thay vào đó, nó ghi lại các thay đổi đối với dữ liệu thô trong từng cơ sở dữ liệu.

Có thể một Proc được lưu trữ từ một cơ sở dữ liệu sẽ hoạt động hoàn toàn trong nhật ký giao dịch của cơ sở dữ liệu khác.

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

Hoặc cho nó để thay đổi cả hai.

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

Những gì được ghi lại trong nhật ký giao dịch là những thay đổi dữ liệu thực tế , không phải là các câu lệnh SQL gây ra chúng. Các mục nhập cho mỗi tệp nhật ký giao dịch là hoàn toàn độc lập, ngoại trừ trong trường hợp CAMIT được ghi vào hai tệp nhật ký cùng một lúc, sau khi giao dịch được thực hiện.

Logic tương tự được áp dụng nếu bạn có một giao dịch lớn hơn đang chạy một số thủ tục được lưu trữ trên nhiều cơ sở dữ liệu. Khi bạn CAM KẾT giao dịch của mình, CAM KẾT sẽ được ghi lại trong nhật ký của mọi cơ sở dữ liệu đã tham gia giao dịch.

Hoàn toàn có thể khôi phục bản sao lưu cơ sở dữ liệu2 và phát lại nhật ký giao dịch của nó trên máy chủ không có cơ sở dữ liệu1.

Hành vi này cho phép một số linh hoạt trong cách các thủ tục và chế độ xem được trình bày trong SQL Server. Nhiều quản trị viên cơ sở dữ liệu giữ các quy trình được lưu trữ của họ - đặc biệt là các quy trình bảo trì - trong cơ sở dữ liệu (ví dụ Admin) hoàn toàn tách biệt với cơ sở dữ liệu ứng dụng / người dùng và viết kết quả của hoạt động bảo trì vào cơ sở dữ liệu đó. Rất may, có thể khôi phục một trong các cơ sở dữ liệu người dùng vào máy chủ phát triển mà không cần phải sao chép lại Admin.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.