CMT交易(REDUX)

时间:2013-01-24 15:54:03

标签: java-ee transactions ejb

再次打扰你......(见CMT Transactions)推测以下内容:

enter image description here

所有TransactionAttributes默认设置为REQUIRED

问题:为什么即使之前的提交不应该发生,find方法也能检索foo?事实上,在调用find()时会插入并选择Foo,但为什么呢?此时交易还没有结束,因为Bar仍然存储。

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

enter image description here

问题:为什么要保存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;
}

澄清非常欢迎!

2 个答案:

答案 0 :(得分:0)

我猜以下情况发生了:

  1. 您已成功将Foo保存到数据库中而未提交。
  2. 同一个数据库用户读取未提交的数据。所以找到了成功。
  3. Bang在数据库中回滚了保存的Foo。
  4. 因此其他数据库用户从未见过保存的Foo记录。您的数据库用户看到它直到回滚发生。

答案 1 :(得分:0)

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