При выполнении транзакции между базами данных в каком журнале транзакций хранится информация?


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журнал транзакций, и это затронет только эту БД. Я также ожидаю, что вы не сможете воспроизвести database1журнал транзакций на сервере, где database2его нет, и наоборот.

.. но я открыт для исправлений!

Ответы:


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

Или для того, чтобы внести изменения в обоих.

... 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 записывается в два файла журнала одновременно, как только транзакция зафиксирована.

Та же логика применяется, если у вас есть большая транзакция, выполняющая несколько хранимых процедур в нескольких базах данных. Как только вы совершите транзакцию, она будет записана в журнал каждой базы данных, которая участвовала в транзакции.

Вполне возможно восстановить резервную копию базы данных2 и воспроизвести ее журналы транзакций на сервере, на котором нет базы данных1.

Такое поведение дает некоторую гибкость в том, как процедуры и представления выложены в SQL Server. Многие администраторы баз данных хранят свои хранимые процедуры - особенно процедуры обслуживания - в базе данных (например Admin), которая полностью отделена от баз данных приложения / пользователя, и записывают результаты операции обслуживания в эту базу данных. К счастью, можно восстановить одну из пользовательских баз данных на сервере разработки без необходимости копирования Admin.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.