我们的应用是高度并发的。它将获取MQ数据并将其保存到数据库中。有多条消息可能包含相同的数据。因此,一条消息可能包含营业时间,第二条消息可能包含营业时间和地点。
所以第一条消息通过,我保存了营业时间数据。然后第二个交易带有与运营时间相同的确切数据。现在我需要保存位置数据,但运行时间是重复的。由于并发性,我无法检查数据库的运行时间(如果我检查,它可能因此不存在,那么当我保存它时,它可能已被另一个线程插入)。我也想快点。 (这个装载机有很多负载。)
目前,消息获得一个事务(Propagation.REQUIRED)(使用Spring和Hibernate)。我在每种数据插入后都进行了刷新。所以我保存位置数据,并进行刷新。然后我节省了营业时间和冲洗。
如果我只是捕获错误消息(它在flush()之后抛出)并吃掉它,其他数据保存(位置数据)是否仍然保存?在数据库插入失败后,事务仍然可以使用吗?因此,如果第一次保存失败,我希望第二次插入工作。
我一直在看Propagation.REQUIRES_NEW,但遇到了一些麻烦。此外,我担心放慢速度。我需要3个事务(在所有这些之前有一些逻辑。)
关于我们谈论回滚的大部分信息,但我不想回滚。我只想继续前进。我可以吗?
答案 0 :(得分:2)
不,您无法捕获异常并尝试继续。以下是chapter about exception handling of the hibernate documentation所说的内容:
如果Session抛出异常,包括任何SQLException, 立即回滚数据库事务,调用Session.close() 并丢弃Session实例。 Session的某些方法不会 使会话保持一致状态。没有例外 Hibernate可以被视为可恢复的。