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

Ian*_*emp 9 sql-server sql-server-2008-r2 transaction-log

鉴于以下代码段:

-- error checking omitted for brevity
begin tran

exec database1..my_stored_procedure
exec database2..my_other_stored_procedure

if (@@error <> 0)
  rollback

commit
Run Code Online (Sandbox Code Playgroud)

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

我希望两个日志都能获得所有数据,因为如果您尝试重放database1事务日志并且它只影响该数据库,那将毫无意义。我还希望您无法database1database2不存在的服务器上重放的事务日志,反之亦然。

.. 但我愿意接受更正!

Nat*_*lly 13

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

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

... 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
Run Code Online (Sandbox Code Playgroud)

或者让它对两者进行更改。

... 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
Run Code Online (Sandbox Code Playgroud)

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

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

完全可以恢复 database2 的备份,并在没有 database1 的服务器上重放其事务日志。

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