再次打扰你......(见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;
}
澄清非常欢迎!
答案 0 :(得分:0)
我猜以下情况发生了:
因此其他数据库用户从未见过保存的Foo记录。您的数据库用户看到它直到回滚发生。
答案 1 :(得分:0)
JBoss 7.1.1中有一个Bug:https://issues.jboss.org/browse/AS7-4552 ...