执行跨数据库事务时,信息存储在哪个事务日志中?


9

给出以下代码段:

-- error checking omitted for brevity
begin tran

exec database1..my_stored_procedure
exec database2..my_other_stored_procedure

if (@@error <> 0)
  rollback

commit

交易信息将插入到哪个数据库的交易日志中?

我希望两个日志都可以获取所有数据,因为如果您尝试重播database1的事务日志就没有任何意义,它只会影响该数据库。我也希望您将无法database1database2不存在的服务器上重播的事务日志,反之亦然。

..但我愿意接受更正!

Answers:


13

正如您所期望的那样,事务日志未记录正在执行的SQL语句。相反,它是独立记录每个数据库中原始数据的更改。

一个数据库中存储的proc可能完全在另一个数据库的事务日志中工作。

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

或同时对两者进行更改。

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

事务日志中记录的是实际数据更改,而不是导致它们发生的SQL语句。每个事务日志文件的条目都是完全独立的,除非在提交事务后将COMMIT同时写入两个日志文件。

如果您有一个较大的事务在多个数据库中运行许多存储过程,则适用相同的逻辑。一旦提交事务,该COMMIT将记录在参与该事务的每个数据库的日志中。

完全有可能还原database2的备份,并在没有database1的服务器上重播其事务日志。

此行为为在SQL Server中如何布置过程和视图提供了一定的灵活性。许多数据库管理员将他们的存储过程(尤其是维护过程)保存在Admin与应用程序/用户数据库完全独立的数据库(例如)中,并将维护操作的结果写入该数据库。值得庆幸的是,可以将用户数据库之一还原到开发服务器,而无需复制Admin

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.