Java-MDB-如何避免并发问题

Java-MDB-如何避免并发问题,java,concurrency,message-queue,Java,Concurrency,Message Queue,我们已经实现了MDB,它将用户输入和处理并行。我们对用户数据(如用户可以拥有的电话号码)进行限制检查 我面临的问题是两个不同的线程拾取同一用户的数据并进行处理。第一个线程很好,它检查限制并将手机正确添加到用户配置文件中。第二个线程也做同样的事情。但是限制检查发生在第一个线程提交事务之前,因此限制检查通过。但它已经超越了极限 有什么办法可以解决吗?让一个用户的数据由同一个线程拾取是可以的。但我不知道该怎么做 请帮忙。提前谢谢 编辑:还有一件事我没有传达。当它在不同的节点上运行时会发生此问题。这取决

我们已经实现了MDB,它将用户输入和处理并行。我们对用户数据(如用户可以拥有的电话号码)进行限制检查

我面临的问题是两个不同的线程拾取同一用户的数据并进行处理。第一个线程很好,它检查限制并将手机正确添加到用户配置文件中。第二个线程也做同样的事情。但是限制检查发生在第一个线程提交事务之前,因此限制检查通过。但它已经超越了极限

有什么办法可以解决吗?让一个用户的数据由同一个线程拾取是可以的。但我不知道该怎么做

请帮忙。提前谢谢


编辑:还有一件事我没有传达。当它在不同的节点上运行时会发生此问题。

这取决于应用程序服务器、节点数量和应用程序,但以下场景对我来说是可以的:

  • Weblogic或JBOSS支持订单单位功能:
消息顺序单位是WebLogic服务器的一项增值功能 启用独立消息生产者或一组生产者 作为一个整体,将消息分组到一个与 处理订单。这个单一的单位被称为有序和有序的单位 要求该单元中的所有消息都按顺序进行处理 它们被创建的顺序

  • 如果更新同一条记录,第一个线程获取锁,第二个线程等待事务提交,那么第二个线程应该检查更新(乐观锁),它可以立即退出
例如


您有一个并发问题,而不是并行问题。你需要某种方法来控制谁何时得到什么。如果没有更多的信息,我就没有什么可以补充的了。@edharned谢谢,我已经相应地更新了问题。看看这个模式:。考虑一下如果用户的空间被划分在服务器中会发生什么。例如,一台服务器处理帐户开始为0-5的用户,另一台服务器处理帐户开始为6-9的用户。现在您有了SPOF,但这可以通过使用租赁机制来解决,其中每个租赁代表一个范围,服务器在启动时获取租赁。我不知道如何实现订单单位功能。你能提供一些链接或信息吗?谢谢。您不需要实现任何东西,只需配置weblogic并将uuid放在消息头上:我将以编程方式使用uuid,因为相同的队列也用于不同的消息。谢谢,我试过了,看起来很有效,没有重复问题。但在集群环境中,具有相同UOO的消息被发送到不同的节点。这是预期的吗?
Thread 1: lastUpd = now() 
Thread 1: UPDATE MYTABLE SET LAST_UPDATE=${lastUpd} WHERE ID=${id}
Thread 2: lastUpd = now()
Thread 2: UPDATE MYTABLE SET LAST_UPDATE=${lastUpd} WHERE ID=${id} //remain locked
Thread 1: a lot of work ...
Thread 1 COMMIT
Thread 2: a lot of work ...
Thread 2: lastUpd2= SELECT LAST_UPDATE MYTABLE WHERE ID=${id}
Thread 2: IF lastUpd2!= lastUpd ROLLBACK