またお邪魔します... (参照: 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;
}
明確化は大歓迎です!