Обработка транзакции:Когда происходит откат?
Вопрос
Недавно этот был опубликован вопрос об определении того, что такое транзакция в общем контексте.Распространенным ответом на этот вопрос было то, что транзакция должна быть атомарной единицей работы.
Мой вопрос связан с этой атомарностью (я думаю). Я часто вижу явные вызовы ROLLBACK в хранимых процедурах SQL.
Является ли общее требование к системам обработки транзакций явным требованием отката?
Происходит ли откат автоматически, если при фиксации возникает какая-то ошибка?
Решение
В системах ТП откат может происходить на основании:
- явный запрос, например вызов ROLLBACK или аналогичный
- любое неперехваченное исключение или ошибку.Они могут включать в себя:
- потеря связи с участником (в распределенной транзакции)
- недопустимое или выходящее за пределы диапазона значение или параметр
- тайм-аут, например, из-за невозможности получить блокировку или задержки пользователя.
- в распределенной транзакции с двухфазной фиксацией - отказ одного из участников проголосовать за фиксацию
Откат не должен происходить, как вы говорите «при совершении совершения», под которым я думаю, вы имеете в виду «при попытке совершить». Транзакция может отказываться в любое время после начала.
Другие советы
В некоторых случаях откат произойдет автоматически из-за срабатывания триггера или нарушения ограничения.В других случаях (как вы видели) хранимая процедура сама выполняет откат.Эйден прав, что автофиксация бывает разной.