Я часто вижу такие заявления, как записи в журнале sql server при каждой операции и операции.
Но я путать о том, что происходит , когда транзакция в конце концов проката назад .
Скажем явная транзакция имеет 3 положения: statement A
, statement B
, statement C
, и , наконец rollback
statement D
.
Теперь скажите, что когда выполнение еще не достигнуто rollback statement D
, будут statements A through C
ли внесенные в журнал изменения записаны в журнал сервера sql?
Понимание 1 :
Заявления от A до D все записываются. SQL Server записывает все, несмотря ни на что.
Понимание 2. Изменения хранятся только где-то в памяти и записываются в журнал только тогда, когда SQL Server видит commit
оператор. Если это rollback
утверждение, SQL Server просто игнорирует транзакцию, запись в журнал не происходит, потому что это не имеет смысла. Другими словами, SQL Server регистрирует, когда есть чистый результат до и после транзакций.
И то, и другое кажется логичным, по крайней мере, мне, но они не могут быть правы. Спасибо за любую помощь.
источник
Ответы:
Понимание 1 правильно. SQL Server записывает каждую операцию, которая изменяет данные, в журнал транзакций. Откат - это изменение данных, поэтому он также записывает это в журнал транзакций. При выполнении оператора A он записывает данные в журнал транзакций, а также резервирует данные в журнале транзакций на случай, если необходимо выполнить откат оператора A. То же самое верно для B и C. При откате транзакции дополнительная информация будет записана в журнал.
Есть много способов увидеть это в действии, поэтому ниже приведена краткая демонстрация. Вот запрос, который я буду использовать, чтобы увидеть, что было записано в журнал:
Мой стол:
Запрос A использует минимальное ведение журнала:
После:
Запрос B не использует минимальное ведение журнала:
После Б:
Запрос C изменяет меньше данных:
После C:
Теперь я буду выдавать
ROLLBACK
и запрашивать DMV, пока происходит откат. Ниже приведена таблица с несколькими снимками:В течение
ROLLBACK
этого времени используемые байты увеличиваются, а зарезервированное количество байтов уменьшается. Это связано с тем, что SQL Server использует пространство, отведенное ранее для отмены транзакции. Чтобы отменить транзакцию, она должна изменить данные, чтобы записать больше данных в журнал.источник
Изменения в таблицах базы данных сначала записываются в файл журнала, затем в сами таблицы, сначала в память, а затем с помощью асинхронного процесса
CHECKPOINT
на диск. Этот механизм известен как WAL (запись в журнал записи) и является общим для всех реляционных баз данных.Сам журнал сначала записывается в память (точнее в буфер журнала), а затем на диск, но ничего не затрагивается таблицами базы данных, пока журнал не будет записан на диск.
Этот механизм позволяет как откатывать зафиксированные транзакции, так и откатывать незафиксированные транзакции в процессе восстановления. Что касается вашего примера, если после чего-то случилось что-то плохое
statement C
и у вас былоcommit
вместоrollback
(вы не можете знать об этом заранее), не сохраняя каждый шаг в транзакции, СУБД не имела бы способа восстановить базу данных в согласованном виде. Таким образом, и сделка не будет соответствоватьD
(долговечность) вACID
.Когда некоторые операции откатываются, это файл данных, который получает сетевые изменения (через
CHECKPOINT
), а не файл журнала.источник
Понимание 1 правильно, и спагеттидба и Джо имеют хорошие объяснения.
Если вы заинтересованы в тестировании для себя (на тестовом экземпляре, пожалуйста), вы можете использовать следующий скрипт:
Вы увидите, что SQL Server записывает все, даже шаги, предпринятые для отмены операций.
источник