1

エラーが発生したときにデータベースの書き込みをロールバックしようとしている、以下の簡単な例に似たコードがあります。ただし、データの半分は、削除/ロールバックされるのではなく、データベースに残っているようです。

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()コマンドで何か不足していますか?

4

1 に答える 1

3

これはバッチ エラー処理の副作用である可能性があります。エラー時に例外を発生させたい場合は、 setBatchErrorMode( false ) を試して呼び出す必要があります。それ以外の場合は、バッチ エラー モードを使用して、収集されたエラーを確認し、コミットするかロールバックするかを決定することもできます。

于 2014-09-26T08:58:53.913 に答える