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 回答