【问题标题】:CMT Transactions (REDUX)CMT 交易 (REDUX)
【发布时间】:2013-01-24 15:54:03
【问题描述】:

又得麻烦你了……(见:CMT Transactions) 推测如下:

所有 TransactionAttributes 默认设置为 REQUIRED

问题:为什么即使先前的提交不应该发生,find 方法也能够检索 foo?确实发生了在调用 find() 时插入并选择了 Foo,但是为什么呢?此时交易尚未结束,因为 Bar 仍有待存储。

现在发生了以下情况(Bang = DuplicateKeyException):

问题:为什么 Foo 被保存?我认为 save(Foo foo) 的方法调用将成为 GlobalService 事务的一部分,注释为 REQUIRED

好的,也许 GlobalClient 感兴趣:

public void createFooBar(Foo foo, Bar bar) throws WrappedThingsGoneBadException
{
    try
    {
        fooService.create(foo); 
    }
    catch (Exception e)
    {
        e.printStackTrace();
    }       

    fooService.doSomethingSilly();

    try
    {
        foo = fooService.findByName(foo.getName());
    }
    catch (Exception e)
    {
        e.printStackTrace();
    }

    try
    {
        barService.create(bar);
    }
    catch (Exception e)
    {
        e.printStackTrace();
    }
}

Foo-和BarService的保存方法:

public Foo create(Foo foo)
{
    em.persist(foo);

    return foo;
}

非常欢迎澄清!

【问题讨论】:

  • 您在数据库中看到保存的 Foo 了吗?
  • "em" 是 javax.persistence.EntityManager,不是吗?

标签: jakarta-ee transactions ejb


【解决方案1】:

我猜发生了以下情况:

  1. 您已成功将 Foo 保存到数据库中,但未提交。
  2. 同一个数据库用户读取了未提交的数据。所以查找成功。
  3. Bang 回滚了数据库中保存的 Foo。

所以其他数据库用户从未看到保存的 Foo 记录。在回滚发生之前,您的数据库用户会看到它。

【讨论】:

  • 谢谢,但 Foo 被持久化了......存储在数据库中。这真的让我发疯; 'em' 是 EntityManager,注入了@PersistenceContext。
  • 你确定你在任何地方都使用 required ,而不是 requires_new 吗?
  • 是的,绝对确定......因为下一个示例使用 REQUIRES_NEW 并且一切都按预期工作。
【解决方案2】:

JBoss 7.1.1 中有一个错误:https://issues.jboss.org/browse/AS7-4552 ...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-06
    相关资源
    最近更新 更多