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

标签 java oracle spring hibernate

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

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

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

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

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

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

最佳答案

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

If the Session throws an exception, including any SQLException, immediately rollback the database transaction, call Session.close() and discard the Session instance. Certain methods of Session will not leave the session in a consistent state. No exception thrown by Hibernate can be treated as recoverable.

关于java - 插入失败后我可以继续数据库事务吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13650604/

相关文章:

java - 寻找圆周率的展开

java - 我无法在 android 上的 asynctask 中获取我的值

c# - Oracle AQ 主题队列使用 ODP.NET 出队

java - j_spring_security_check http 404 使用 SecurityConfig

java - 没有属性的 getter 方法...错误

java - 并行序列比对算法

java - 使用 setValueAt 更新 JTable

Python cx_oracle 多线程不适用于每个线程的游标

sql - 如何清除 Oracle 中的所有缓存项

在存储库中带有或不带有显式声明的 Spring Data Rest 投影