【问题标题】:Manage Database Transactions [duplicate]管理数据库事务 [重复]
【发布时间】:2021-09-30 03:57:56
【问题描述】:

我们正在开发一个 PostgreSQL 数据库。我们在表中有数千条记录要更新。由于我们正在执行验证,我们必须一一提交记录。

问题是如果有 10000 条记录并且在记录号 9000 处发生错误,我们有 8999 条记录提交到数据库。我们不想保留半途处理的数据。

我们如何实现一个功能,以便在发生错误时回滚所有内容?我知道如果记录被提交,我们不能回滚。我需要一种不同的方法。

【问题讨论】:

  • BEGIN; <DO MANY INSERTS> COMMIT;。如果在 中发生错误ROLLBACK;
  • 是的,您可以看到:JDBC transactionsSO answer
  • 我怀疑您必须逐行COMMIT。请详细说明此要求的原因。
  • @AdrianKlaver(关于您的第一条评论):您可以显式调用BEGINCOMMIT,并不意味着您应该,JDBC 规范说提交应该通过 JDBC API 处理。否则可能会导致驱动程序出现未定义的行为。
  • @MarkRotteveel,在发表评论时,OP 没有指出他们在哪里使用 Java(JDBC)。无论如何,这是一个通用的建议,即使通过 API 仍然适用。

标签: java postgresql jdbc transactions


【解决方案1】:

我们如何实现一个功能,以便在发生错误时回滚所有内容?

这是交易的教科书示例。

好吧,不要提交每个更改的行。在循环之前启动事务,运行更新。如果没有抛出异常,则提交。否则回滚。

类似的东西:

Connection con = ...; // get the connection.
con.setAutocommit(false); // start a transaction
try (Statement stmt = ...;) {
  while (more stuff to do) {
    stmt.executeUpdate("...."); // do your update
  }
  con.commit(); // commit all updates 
} catch (SQLException ex) {
  ex.printStackTrace(); // this should be a call to your logger 
  con.rollback();
}

你可能还想看一下this tutorial,尤其是关于transactions的章节

【讨论】:

  • 非常感谢您的回答。我会调查一下并尝试一下。
猜你喜欢
  • 1970-01-01
  • 2012-03-08
  • 1970-01-01
  • 2010-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-15
  • 1970-01-01
相关资源
最近更新 更多