代码之家  ›  专栏  ›  技术社区  ›  ewernli

在提交事务之前传递JMS消息

  •  20
  • ewernli  · 技术社区  · 14 年前

    我有一个非常简单的场景,包括 数据库 和一个 在应用服务器(Glassfish)中。情况非常简单:

    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. 
    

    在提交插入之前传递消息 在数据库里。如果我们考虑2阶段提交协议,这是可以理解的:

    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 ,但答案总是: 奇怪,它应该是开箱即用的

    • 它怎么能开箱即用呢?
    • 我的情况听起来很简单,为什么没有更多的人有类似的问题?
    • 我做错什么了吗?有没有办法正确地解决这个问题?

    关于我对这个问题的理解,这里有更多的细节:

    只有按此顺序对待参与者时,才会存在此时间问题。如果2PC以相反的顺序对待参与者(首先是数据库,然后是消息代理),那应该没问题。这个问题是随机发生的,但完全可以重现。

    1 回复  |  直到 14 年前
        1
  •  12
  •   BenMorel Sonaten    11 年前

    您正在体验经典的XA 2 PC竞速状态。它确实发生在生产环境中。

    1. 最后一个代理优化,其中JDBC是非XA资源。(丢失恢复语义)
    2. 有时间交货(故意失去实时性)

    Weblogic的LLR优化避免了这个问题,并为您提供了所有XA保证。

    推荐文章