1

又得麻烦你了……(见: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;
}

非常欢迎澄清!

4

2 回答 2

0

我猜发生了以下情况:

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

所以其他数据库用户从来没有看到保存的 Foo 记录。您的数据库用户看到它,直到发生回滚。

于 2013-01-24T17:48:35.247 回答
0

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

于 2013-02-21T12:56:28.643 回答