エラーが発生したときにデータベースの書き込みをロールバックしようとしている、以下の簡単な例に似たコードがあります。ただし、データの半分は、削除/ロールバックされるのではなく、データベースに残っているようです。
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)
andconnection->rollback()
コマンドで何か不足していますか?