БД на диск. Отчитался в журнал транзакций.
Update обновила строку на страничке. Транзакция завершилась. Записалась в журнал транзакций.
Прибежал LazyWriter утащил эту грязную страницу на диск.
Наступил жёсткий резет сервера, всё резко отключилось.
Сервер поднялся, поднял БД в память, нашёл чекпоинт в логе, и стал проигрывать журнал с этого места. Дошёл до нужной транзакции, прочитал страничку с диска (а она же уже изменённая - так как записана LazyWriterом ранее).
В интернете говорится что "A lazy writer does not make any entry in the transaction log".
Получается, что он применит транзакцию к изменённой странице?
Или как SQL Server узнает, что страничка уже изменилась?
В заголовке (header) страницы есть lsn последнего изменения https://sqlity.net/en/2088/page-header-explained/
Ага. То есть в Redo фазе, в случае LSN страницы выше, чем транзакции, то транзакция отбрасывается, считая, что она уже накатилась.
а у тебя это вопрос любопытства или какой-то рабочий кейс?
Чистое любопытство. Задумался, что с чекпойнтом всё просто, а как быть с LW? Решение оказалось довольно элегантным.
Обсуждают сегодня