Если приложение выполняет транзакцию на сервере базы данных, и приложение аварийно завершает работу (внезапно отключается от базы данных) перед фиксацией транзакции, сервер базы данных откатывает транзакцию. Отключение не оставляет базу данных в непригодном (потенциально заблокированном) состоянии.
Таким образом, содержимое вашей базы данных не будет отражать ни одну из ваших трех операций UPDATE, когда ваше приложение вылетает во время транзакции. Он просто потеряет текущую транзакцию.
Как справиться с этим потенциальным режимом сбоя?
- Уменьшите вероятность ошибки sh во время транзакции. Старайтесь не делать в своем приложении вещей, которые могут сделать его sh в процессе обработки транзакции. Например, если вы получаете данные с какого-то другого сервера или устройства, получите их все до того, как начнете транзакцию. Этого решения обычно достаточно для производственных приложений.
- Создайте для своего приложения какой-то способ после перезапуска, чтобы узнать о последней успешной транзакции. Один хороший способ? Добавьте такой столбец в одну из ваших таблиц: (это MySQL).
last_update_timestamp TIMESTAMP DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
Это приводит к тому, что каждая операция UPDATE в каждом столбце автоматически ставит NOW()
в столбец last_update_timestamp
. Затем, когда ваше аварийное приложение перезапустится, вы можете сделать
SELECT MAX(last_update_timestamp) FROM table
, и вы узнаете, когда произошло самое последнее успешное обновление. Это автоматическое c обновление также откатывается при откате транзакции. Если вы знаете, когда произошло последнее успешное обновление, ваше приложение может повторить то, которое было откатано Cra sh.
Если вы решите создать возможность повторной транзакции, обязательно создайте его, чтобы вы могли его протестировать! if (testingAppCrash) crashNow = 1 / 0;
может помочь в вашем приложении.