插入失败后我可以继续数据库事务吗?

时间:2012-11-30 18:00:01

标签: java oracle spring hibernate

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

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

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

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

我一直在看Propagation.REQUIRES_NEW,但遇到了一些麻烦。此外,我担心放慢速度。我需要3个事务(在所有这些之前有一些逻辑。)

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

1 个答案:

答案 0 :(得分:2)

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

  

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