У меня есть код, похожий на простой пример ниже, который пытается откат записи базы данных при возникновении ошибки. Однако половина данных, по-видимому, остается в базе данных, а не удаляется/откатывается.Откат транзакции с 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()
?
Я никогда не использовал Oracle, но разве вам не нужно «совершать» утверждения после последнего утверждения? Насколько мне известно, изменения становятся постоянными в БД только после выполнения инструкции 'commit'. – Rohith
Извините, да, вы правы. Я добавлю его в свой пример. К сожалению, это не проблема, которую я пытаюсь исправить, проблема в том, что она совершает, а не откатывается. –
О, я не могу вам помочь. Но попытался ли создать точку сохранения и вернуться к этой точке сохранения? Вы уверены, что команда отката вызывается в строке, где сбой уникального ограничения? – Rohith