我有一个基于MDB的事件驱动的应用程序,Spring集成和用于持久性的JPA。 该应用程序部署在weblogic 10.3上,默认值为max-pool-size(16)。
我的应用程序需要处理一些修改DB的消息。 想象一下,我有一个用例,我必须处理一些消息,如果它们不存在则需要插入一个域对象,如果它存在则更新它。
所以我修改数据库的组件检查对象是否存在,然后在JPA上调用合并。 由于我在dao上调用合并时并行执行了两个并发消息,因此JPA会触发两个insert语句,因为该对象尚未持久化,因此只有其中一个正确执行。
在事件驱动的应用程序中是否有处理这种“竞争条件”的模式?
亲切的问候 马西莫
答案 0 :(得分:1)
最简单的解决方案是捕获第二个插入引发的异常,然后再次调用merge
,这应该执行更新。
或者,您可以尝试在merge
事务隔离中执行SERIALIZABLE
,应该确保第二个merge
被阻止,直到第一个{{1}}完成,然后第二个应该执行更新。
这整个场景的主要问题是,如果您有多个并发事件需要修改给定实体,那么如何确保以正确的顺序执行它们?当然你需要按顺序处理这些,而不是同时处理?如果您使用并发事件使用者,则订单将是不确定的。