1

またお邪魔します... (参照: CMT トランザクション) 以下を想定:

ここに画像の説明を入力

デフォルトで REQUIRED に設定されたすべての TransactionAttributes

質問: 前回のコミットが行われるべきではない場合でも、find メソッドが foo を取得できるのはなぜですか? 確かに、find() の呼び出しで Foo が挿入されて選択されることがありましたが、なぜでしょうか? Bar はまだ保管されているため、この時点ではトランザクションは終了していません。

次のことが起こりました (Bang = DuplicateKeyException):

ここに画像の説明を入力

質問: Foo が保存されるのはなぜですか? REQUIRED に注釈が付けられているように、 save(Foo foo) のメソッド呼び出しは GlobalService トランザクションの一部になると思いました

OK、おそらく 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 の save メソッド:

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 に答える