История изменений
Исправление
dzidzitop,
(текущая версия)
:
Покажите код, плиз.
когда просят реализовать что-то подобное, то я всегда спрашиваю «как должна вести себя система, если что-то пошло не так в середине процесса?». пока мне не ответят, не приступаю к реализации. когда ответят - реализую так, как нужно. список файлов наверх я бы передавал как какой-нибудь std::vector. что внутри - зависит от задачи. наличие такого vector of errors было бы частью API. что делали б наверху с этим списком - меня внутри функции не колышет. что б делал я - то, что меня бы попросили реализовать. к тому времени все нужные flush(), close(), ~File() уже давно вызваны.
Во всех остальных случаях, если что-то пошло не так, следует дернуть rollback.
проблема только в том, что rollback вернёт ошибку, если, например, сеть упала. а на базе будет висеть незавершённая транзакция. а про это никто не узнает, кроме админа. конкретно я бы писал код в стиле
success = false;
try {
/* code */;
commit();
success = true;
} catch (...) {
if (!success) {
rollback();
}
throw;
}
и точно не полагался бы на деструктор. первый вариант тоже не очень, ибо плюсовый код кидает исключения, поэтому можно где-то что-то недосмотреть.
Исходная версия
dzidzitop,
:
Покажите код, плиз.
когда просят реализовать что-то подобное, то я всегда спрашиваю «как должна вести себя система, если что-то пошло не так в середине процесса?». пока мне не ответят, не приступаю к реализации. когда ответят - реализую так, как нужно. список файлов наверх я бы передавал как какой-нибудь std::vector. что внутри - зависит от задачи. наличие такого vector of errors было бы частью API. что делали б наверху с этим списком - меня внутри функции не колышет. что б делал я - то, что меня бы попросили реализовать. к тому времени все нужные flush(), close(), ~File() уже давно вызваны.
Во всех остальных случаях, если что-то пошло не так, следует дернуть rollback.
проблема только в том, что rollback вернёт ошибку, если, например, сеть упала. а на базе будет висеть незавершённая транзакция. а про это никто не узнает, кроме админа. конкретно я бы писал код в стиле
success = false;
try {
/* code */;
commit();
success = true;
} catch (...) {
if (!success) {
rollback();
}
throw;
}
и точно не полагался бы на деструктор. первый вариант тоже не очень, ибо плюсовый код кидает исключения, поэтому можно где-то что-то недосмотреть.