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

标签 java concurrency message-queue

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

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

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

请帮忙。提前致谢。

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

最佳答案

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

  • Weblogic 或 JBOSS 支持订单单位功能:

Message Unit-of-Order is a WebLogic Server value-added feature that enables a stand alone message producer, or a group of producers acting as one, to group messages into a single unit with respect to the processing order. This single unit is called a Unit-of-Order and requires that all messages from that unit be processed sequentially in the order they were created.

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

例如。

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

关于Java - MDB - 如何避免并发问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21592912/

相关文章:

multithreading - RabbitMQ - 每个路由键单个并发 worker

java - JAR 添加到 Gradle 项目,但 build.gradle 中没有条目

java - yield() 的主要用途是什么,它与 join() 和 interrupt() 有何不同?

java - 如何使用 Java 修改现有 Excel 工作簿

java - 对于 Java 中的生产者-消费者来说,什么是更好的习惯用法?

java - 给定数据库结构可以在运行时更改,如何处理并发 SQL 更新

c++ - 将类对象指针打包成 char * 用于消息队列

rabbitmq - 对于低端设置,RabbitMQ有什么好的替代品吗?

java - 最小化 Java 线程上下文切换开销

带参数和不带参数的 Java 泛型列表和 ArrayList