MDB上的竞争条件:这是处理它的最佳方式吗?

时间:2012-01-20 09:44:23

标签: java-ee event-handling race-condition message-driven-bean

我有一个基于MDB的事件驱动的应用程序,Spring集成和用于持久性的JPA。 该应用程序部署在weblogic 10.3上,默认值为max-pool-size(16)。

我的应用程序需要处理一些修改DB的消息。 想象一下,我有一个用例,我必须处理一些消息,如果它们不存在则需要插入一个域对象,如果它存在则更新它。

所以我修改数据库的组件检查对象是否存在,然后在JPA上调用合并。 由于我在dao上调用合并时并行执行了两个并发消息,因此JPA会触发两个insert语句,因为该对象尚未持久化,因此只有其中一个正确执行。

在事件驱动的应用程序中是否有处理这种“竞争条件”的模式?

亲切的问候 马西莫

1 个答案:

答案 0 :(得分:1)

最简单的解决方案是捕获第二个插入引发的异常,然后再次调用merge,这应该执行更新。

或者,您可以尝试在merge事务隔离中执行SERIALIZABLE应该确保第二个merge被阻止,直到第一个{{1}}完成,然后第二个应该执行更新。

这整个场景的主要问题是,如果您有多个并发事件需要修改给定实体,那么如何确保以正确的顺序执行它们?当然你需要按顺序处理这些,而不是同时处理?如果您使用并发事件使用者,则订单将是不确定的。