2014-09-16 2 views
1

У меня есть код, похожий на простой пример ниже, который пытается откат записи базы данных при возникновении ошибки. Однако половина данных, по-видимому, остается в базе данных, а не удаляется/откатывается.Откат транзакции с 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()?

+0

Я никогда не использовал Oracle, но разве вам не нужно «совершать» утверждения после последнего утверждения? Насколько мне известно, изменения становятся постоянными в БД только после выполнения инструкции 'commit'. – Rohith

+0

Извините, да, вы правы. Я добавлю его в свой пример. К сожалению, это не проблема, которую я пытаюсь исправить, проблема в том, что она совершает, а не откатывается. –

+0

О, я не могу вам помочь. Но попытался ли создать точку сохранения и вернуться к этой точке сохранения? Вы уверены, что команда отката вызывается в строке, где сбой уникального ограничения? – Rohith

ответ

3

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

+0

Интересно, я дам пакетные ошибки выстрелом. Я считаю, что batchErrorMode по умолчанию ложно, но я попробую его в понедельник –

+0

@ SamuelO'Malley Как все прошло? – Falco

+1

Спасибо @Falco, что он работает сейчас, я установил batchErrorMode в true и явно обработал ошибки уровня инструкций. –

 Смежные вопросы

  • Нет связанных вопросов^_^