Откат транзакции с Oracle OCCI

У меня есть код, похожий на простой пример ниже, который пытается откатить запись в базу данных при возникновении ошибки. Однако похоже, что половина данных остается в базе данных, а не удаляется / откатывается.

statement->setAutoCommit(false);
statement->setMaxIterations(3);

int counter = 1;
try
{
    statement->setInt(1, 1);
    statement->addIteration();

    statement->setInt(1, 2);
    statement->addIteration();

    statement->setInt(1, 3);
    statement->executeUpdate();

    statement->setInt(1, 4);
    statement->addIteration();

    statement->setInt(1, 2); // ERROR HERE (Unique constraint)
    statement->addIteration();

    statement->setInt(1, 6);
    statement->executeUpdate();

    connection->commit();
}
catch (oracle::occi::SQLException ex)
{
    connection->rollback();
    connection->terminateStatement(statement);
    throw DatabaseException(ex.what());
}

Если я получаю сообщение об ошибке Oracle, я хочу откатить текущую транзакцию, чтобы не было записано НИКАКИХ строк. Однако, похоже, это не работает должным образом.

У меня есть запись, которая не выполняется на полпути, и она не может успешно откатить строки. Я получаю половину данных, записанных в базу данных.

Я что-то упустил с командой setAutoCommit(false) и connection->rollback()?


person Samuel O'Malley    schedule 16.09.2014    source источник
comment
Я никогда не использовал Oracle, но разве вам не нужно commit выполнять операторы после последнего оператора? Насколько мне известно, изменения становятся постоянными в БД только после выполнения оператора commit.   -  person Rohith    schedule 25.09.2014
comment
Простите, да, вы правы. Я добавлю это в свой пример. К сожалению, это не та проблема, которую я пытаюсь исправить, проблема в том, что он совершает, а не откатывается.   -  person Samuel O'Malley    schedule 26.09.2014
comment
Ой, я не могу тебе здесь помочь. Но вы пытались создать точку сохранения и вернуться к ней? Вы уверены, что команда отката вызывается в строке, где не удалось выполнить ограничение уникальности?   -  person Rohith    schedule 26.09.2014


Ответы (1)


Это могло быть побочным эффектом пакетной обработки ошибок вам следует попробовать вызвать setBatchErrorMode (false), если вы хотите, чтобы при ошибке генерировалось исключение. В противном случае вы также можете использовать режим пакетных ошибок и проверить собранные ошибки и решить, хотите ли вы зафиксировать или откатить

person Falco    schedule 26.09.2014
comment
Интересно, я попробую исправить пакетные ошибки. Я считаю, что по умолчанию batchErrorMode имеет значение false, но я попробую его в понедельник. - person Samuel O'Malley; 27.09.2014
comment
@ SamuelO'Malley Как все прошло? - person Falco; 30.09.2014
comment
Спасибо @Falco, теперь он работает, я установил для batchErrorMode значение true и явно обработал ошибки уровня оператора. - person Samuel O'Malley; 02.10.2014