我将尝试描述我要解决的问题。我意识到我开发的一个应用程序的 Spring 事务管理实现得很差。我在 DAO 接口方法 (CRUD) 上定义事务,而不是在服务层方法上使用声明性方法。它是一个 Web 应用程序,它执行某种消息处理,并且多个线程同时对同一个消息实例进行操作。以下是典型序列中的步骤:
- 消息在 T1(事务 1)中创建并放入出站队列。T1 终止。
- 消息由不同的线程从队列中取出,发送和更新发送时间和一些附加信息。设置消息对象的属性并调用 dao.update(m),t2 开始。
- 在 t2 提交之前,接收到传递报告并且 Tread3 开始处理相同的消息对象,方法是在 db 中找到它(保存在步骤 1 中),更新它的 state 属性并调用 dao.upate(m) 以便 t3 在 t2 仍在进行中时启动。
- 另一个线程(线程 4)通过在 t4 中再次更改它的状态来进一步处理相同的消息对象。
不时发生的结果是,从 t2 开始的更改丢失,db 中的发送时间为空。我需要帮助来弄清楚如何改进应用程序设计并通过防止并发处理同一消息来消除此问题。
我应该专注于事务重新设计(在服务级别而不是 dao 上使用它)并使用可序列化的隔离级别(或其他)还是
我应该使用 JPA 实体管理器锁定吗?
应用程序使用带有休眠实现的 spring 3 和 JPA2。