【问题标题】:Can I continue with a database transaction after a failed insert?插入失败后我可以继续数据库事务吗?
【发布时间】:2012-11-30 18:00:00
【问题描述】:

我们的应用程序是高度并发的。它正在获取 MQ 数据并将其保存到数据库中。有多个消息可能包含相同的数据。因此,一条消息可能包含营业时间,而第二条消息可能包含营业时间和位置。

所以第一条消息传来,我保存了营业时间数据。然后第二笔交易带有相同的营业时间数据。现在我需要保存位置数据,但营业时间是重复的。由于并发性,我无法检查数据库的运行时间(如果我检查,它可能不存在,那么当我保存它时,它可能已被另一个线程插入)。我也想快点。 (这个加载器有很多负载。)

当前一条消息获得一个事务(Propagation.REQUIRED)(使用 Spring 和 Hibernate)。我在每种数据插入后进行刷新。所以我保存了位置数据,然后刷新。然后我保存工作时间并冲洗。

如果我只是捕获错误消息(它在flush()之后抛出)并吃掉它,那么保存的其他数据(位置数据)还会保存吗?数据库插入失败后,事务仍然可以使用吗?所以如果第一次保存失败,我希望第二次插入工作。

我一直在查看 Propagation.REQUIRES_NEW 但遇到了一些麻烦。另外,我担心会减慢速度。我需要 3 笔交易(在这之前有一点逻辑。)

我们谈论回滚的大部分信息,但我不想回滚。我只想继续前进。可以吗?

【问题讨论】:

  • 这听起来像是老式 JDBC 的工作,如果你真的需要用 Hibernate 来做,也许是无状态会话?

标签: java oracle spring hibernate


【解决方案1】:

不,您无法捕获异常并尝试继续。这是chapter about exception handling of the hibernate documentation 所说的:

如果 Session 抛出异常,包括任何 SQLException, 立即回滚数据库事务,调用 Session.close() 并丢弃 Session 实例。 Session 的某些方法不会 使会话保持一致状态。没有抛出异常 Hibernate 可以被视为可恢复的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-09
    • 2020-04-09
    • 2014-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-07
    • 1970-01-01
    相关资源
    最近更新 更多