Каков механизм отката транзакций на сервере sql? - PullRequest
5 голосов
/ 21 февраля 2010

Каков механизм отката транзакций на сервере sql?

Ответы [ 3 ]

9 голосов
/ 21 февраля 2010

Каждое обновление в базе данных сначала записывает в журнал запись, содержащую описание изменения. Например. если вы обновите значение столбца с A до B, журнал будет содержать запись об обновлении, что-то вроде: в таблице T столбец C был изменен с A на B для записи с ключом K посредством транзакции с идентификатором I. Если вы откатите транзакции, движок начнет сканирование журнала в обратном порядке в поисках записей работы, выполненной вашей транзакцией, и отменит работу: когда он найдет запись обновления с A на B, изменит значение обратно на A. Вставка будет отменена удалив вставленную строку. Удаление будет отменено, вставив обратно строку. Это описано в Логическая архитектура журнала транзакций и Журнал транзакций с отложенной записью .

Это объяснение высокого уровня, точные внутренние детали того, как это происходит, не документированы для неспециалистов и не подлежат проверке или изменениям.

3 голосов
/ 21 февраля 2010

С точки зрения того, как это происходит, все модификации данных внутри транзакции хранятся в журнале транзакций, при этом в журнале также резервируется дополнительное пространство для записей отмены в случае необходимости отката. В каждом журнале транзакций содержится достаточно информации, чтобы отменить внесенное изменение, чтобы при необходимости оно могло отменить изменение. (А также воспроизвести их в сценарии DR)

Если мы возьмем простую операцию удаления в качестве примера (поскольку я расшифровал это здесь в качестве примера содержимого журнала), удаляемая запись сохраняется в записи журнала транзакций LOP_DELETE_ROWS и с некоторые нетривиальные усилия, которые вы можете декодировать и продемонстрировать, что вся строка находится в записи журнала.

Если транзакцию нужно откатить, будет использовано место для отмены, зарезервированное в журнале, и строка будет вставлена ​​заново. Причиной отмены резервирования места является то, что журнал транзакций не может быть заполнен в середине транзакции, не оставляя места для завершения или отката.

3 голосов
/ 21 февраля 2010

Посмотрите на ROLLBACK TRANSACTION (Transact-SQL)

Откат явной или неявной транзакции до начала транзакции или до точки сохранения внутри транзакции.

...