2

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

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

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

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

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

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

4

1 回答 1

3

不,您无法捕获异常并尝试继续。这是关于休眠文档的异常处理的章节所说的:

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

于 2012-11-30T18:41:12.693 回答