Якщо транзакція "здійснена", то це точно збережено?


12

Якщо транзакція здійснена успішно, чи можу я бути на 100% впевнений, що вона була записана в базу даних І в файли журналу? Чи можу я бути впевнений, що дані збережені?

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

Під час запуску сервер зробив "відновлення бази даних" - чи можу я бути впевнений, що знову все в порядку?


2
Ви можете перевірити журнал помилок після завершення відновлення, щоб побачити, скільки транзакцій було здійснено, а скільки відкату назад. На це немає ніякої магічної відповіді - якщо диск вийшов з ладу, то все залежить від стану транзакцій на той час.
Аарон Бертран

1
@AaronBertrand Але якщо транзакція перебуває у стані "скоєння" (тобто фіксація була успішною), то як тоді можливо бути втраченим під час відновлення?
SQL Police

3
@Giosco: Не може. "скоєний" означає, що він знаходиться у файлі журналу бази даних. Єдиний спосіб втратити його після цього - або 1) втратити файл журналу до того, як він також буде збережений у файл даних, або 2) втратити і файл журналу, і файл даних, або 3) помилку людини. Зауважимо, що (3) зазвичай найімовірніший.
RBarryYoung

2
@Giosco як ти знаєш, що всі твої транзакції на час повного приводу були успішно здійснені?
Аарон Бертран

2
Збережена процедура <> транзакція - ваша збережена процедура може мати декілька явних транзакцій, або лише неявну, може бути логіка спробу / лову, може бути обробка транзакцій на рівні C # тощо тощо. Знову ж таки, якщо не бути винятком = вдала комісія може бути трохи занадто небезпечним, як бланк.
Аарон Бертран

Відповіді:


16

Якщо клієнтська заявка видала COMMIT і повернула код успіху, двигун гарантує надійність транзакції. Гарантується, що всі зміни, здійснені в транзакції, будуть видимими навіть після збоїв. Крім того, відновлення також гарантує, що будь-яка здійснена транзакція буде відмовлена ​​у разі аварії.

Для отримання більш детальної інформації рекомендую прочитати папір ARIES .

Ведення журналу та відновлення заздалегідь не може дати гарантій, якщо в базовому обладнання для зберігання є несправності (пошкодження). І будь-який інженерний виріб може містити дефекти.

Ваша програма, як і всі інші програми, повинна бути ретельно написана, щоб правильно вести себе при наявності збоїв (помилок). Магії немає.


Якщо клієнтська програма видала COMMIT, але відповідь від БД не отримана до часу очікування на стороні клієнта. Що з цим зобов’язанням? успіх чи невдача? Як перевірити?
Габ 是 好人
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.