LINUX.ORG.RU

История изменений

Исправление 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;
}


и точно не полагался бы на деструктор. первый вариант тоже не очень, ибо плюсовый код кидает исключения, поэтому можно где-то что-то недосмотреть.