使用Oracle OCCI回滚事务

时间:2014-09-16 07:34:40

标签: sql oracle transactions 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错误,那么我想回滚当前事务,以便写入NO行。然而,这似乎并没有正常工作。

我的写入失败了一半,并且它没有成功回滚行。我最终将一半数据写入数据库。

我错过了使用setAutoCommit(false)connection->rollback()命令的内容吗?

1 个答案:

答案 0 :(得分:3)

如果您希望在出错时引发异常,这可能是batch error processing的副作用,您应该尝试调用setBatchErrorMode(false)。否则,您还可以使用批处理错误模式并检查收集的错误并确定是否要提交或回滚