我有一个非常简单的场景,涉及应用服务器(Glassfish)中的database和JMS.情况非常简单:
1. an EJB inserts a row in the database and sends a message.
2. when the message is delivered with an MDB, the row is read and updated.
问题是有时数据库中的message is delivered before the insert has been committed.如果我们考虑两阶段提交协议,这实际上是可以理解的:
1. prepare JMS
2. prepare database
3. commit JMS
4. ( tiny little gap where message can be delivered before insert has been committed)
5. commit database
这个问题我已经讨论了with others次,但答案总是:"Strange, it should work out of the box".
我的问题是:
- 它怎么能开箱即用呢?
- 我的情况听起来很简单,为什么没有更多的人有类似的问题呢?
- 我做错什么了吗?有没有办法正确解决这个问题?
以下是关于我对这个问题的理解的更多细节:
只有按此顺序对待参与者时,才会存在时间问题.如果2PC以相反的顺序对待参与者(首先是数据库,然后是消息代理),那应该没问题.这个问题是随机发生的,但完全可以重现.
在JTA、JCA和JPA规范中,我发现没有办法控制分布式事务中参与者的顺序,在Glassfish文档中也是如此.我们可以假设它们将根据使用顺序被登记到分布式事务中,但是对于JPA这样的ORM,很难知道何时刷新数据以及何时真正使用数据库连接.有什么 idea 吗?