Если транзакция «зафиксирована», то сохраняется ли она точно?

12

Если транзакция зафиксирована успешно, могу ли я быть на 100% уверен, что она была записана в базу данных И в файлы журнала? Могу ли я быть уверен, что данные сохранены?

Сегодня наши файлы журнала достигли предела накопителя, и мы получили много ошибок. Кроме того, некоторые другие службы потерпели крах. Мы увеличили диск и перезапустили сервер.

Во время запуска сервер сделал «восстановление базы данных» - могу ли я быть уверен, что все снова в порядке?

Полиция SQL
источник
2
Вы можете проверить журнал ошибок после завершения восстановления, чтобы увидеть, сколько транзакций было зафиксировано и сколько откатано. На это нет волшебного ответа - если диск сломался, все зависит от состояния транзакций в то время.
Аарон Бертран
1
@AaronBertrand Но если транзакция находится в состоянии «зафиксировано» (т. Е. Зафиксировано, что операция прошла успешно), как может быть возможно, что она все еще потеряна во время восстановления?
Полиция SQL
3
@Giosco: не может. «совершенный» означает, что он находится в файле журнала базы данных. Единственный способ потерять его после этого - это либо 1) потерять файл журнала, прежде чем он также будет сохранен в файле данных, либо 2) потерять как файл журнала, так и файл данных, или 3) человеческая ошибка. Обратите внимание, что (3) обычно является наиболее вероятным.
RBarryYoung
2
@Giosco, откуда вы знаете, что все ваши транзакции на момент полного привода были успешно совершены?
Аарон Бертран
2
Транзакция хранимой процедуры <> - ваша хранимая процедура может иметь несколько явных транзакций или только неявных, может быть логика try / catch, может быть обработка транзакций на уровне C # и т. Д. И т. Д. И снова, при условии, что исключение = успешная фиксация может быть слишком опасным, как общее утверждение.
Аарон Бертран

Ответы:

16

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

Для более подробной информации я рекомендую прочитать статью ОВЕН .

Журналирование и восстановление с опережением записи не могут гарантировать, что в базовом оборудовании хранилища имеются сбои (повреждение). И любой инженерный продукт может содержать дефекты.

Ваше приложение, как и все другие приложения, должно быть тщательно написано, чтобы правильно вести себя при наличии сбоев (ошибок). Там нет магии.

Ремус Русану
источник
Если клиентское приложение выдало COMMIT, но ответ от БД не будет получен до истечения времени ожидания на стороне клиента. Как насчет этого коммита? успех или неудача? Как проверить?
Gab 是 好人