【问题标题】:How can we implement a nested transaction in JDBC?我们如何在 JDBC 中实现嵌套事务?
【发布时间】:2011-07-14 19:18:52
【问题描述】:

首先让我解释一下嵌套事务的含义。

示例:假设在主类中我们调用 method1 并使用 jdbc[Transaction1] 创建客户。它还没有提交。现在我们在主类中调用method2 并为刚刚创建的客户[Transaction2] 创建帐户。现在提交。根据您的解释,这两项交易都将被视为一笔交易的一部分(因为最多可以有一笔交易与连接)。到这里,如果我们比较上面的场景,它就像Spring 中的propagation_required。对吗?

现在,如果我们只想提交 transaction2 而不是那个。那么这个场景就像 Spring 中的 propagation_Nested 一样。对吗?

如果上述两个假设都正确,我们如何在 JDBC 中实现嵌套事务?

【问题讨论】:

  • 我不确定您的问题为何被否决。这看起来是一个合理的问题。我赞成它以保持平衡。

标签: spring jdbc


【解决方案1】:

这并不完全是嵌套事务的工作方式。如果回滚事务 1,事务 2 也会回滚。使用嵌套事务,您可以回滚事务 2 并仍然提交事务 1。

在 JDBC 中,您可以使用保存点来实现此效果。您可以在创建帐户之前调用 Connection.setSavepoint(),如果您想回滚该操作但仍提交创建客户,您可以回滚到该保存点。

如果您希望能够完全独立地提交/回滚两个事务,例如 Spring REQUIRES_NEW,在 JDBC 中您应该使用两个连接并独立管理它们上的事务。

【讨论】:

  • 假设我们一次性提交上述两个事务(使用 connevtion.commit)。在此过程中,transaction2 发生了一些异常。现在会是什么结果,是部分提交还是两个事务都回滚?
  • 我相信在这种情况下,您应该能够回滚事务 2 并仍然提交事务 1,因此会创建用户,但要考虑该用户 - 不是。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-09
  • 1970-01-01
  • 1970-01-01
  • 2016-06-30
  • 1970-01-01
  • 2012-06-26
相关资源
最近更新 更多