2016-05-03 28 views
0

假设我有一个托管bean,并且我定义了一个EntityManager。我很想知道事务是如何工作的以及它们在各种不同情况下的表现。从文档中,我明白flush()实际上用于覆盖提交上的延迟并立即执行。所以在下面的示例中,我期待demo坚持DB和demo2不是。但它似乎都被视为单一交易(从我的理解)。这是为什么发生?为什么不需要begin()commit()的进一步注释或休眠方法来定义事务的开始和结束?我觉得我在这里很混乱不同的东西......JTA交易回滚

@Stateless 
public class Testing { 
    @PersistenceContext(unitName = "testDB") 
    private EntityManager em; 

    public void doSomeWork(){ 
     Demo demo = new Demo(); 
     em.persist(demo); 
     em.flush(); 
     //some code that makes it crash 
     Demo demo2 = new Demo(); 
     em.persist(demo2); 
     em.flush(); 
    } 
} 

回答

1

当使用Container managed transactions所有会话bean是由事务中的默认运行。这意味着,如果发生导致事务回滚的异常,则对demo的更改也会回滚。

下面是关于如何flush()作品一些有用的信息:https://en.wikibooks.org/wiki/Java_Persistence/Persisting#Flush

+0

如何“交易中”规定的?每次方法调用都有单个事务吗?如果有两个呼叫彼此无关,第二个呼叫失败,会怎么样呢?第一个也会回滚吗? – Rakim

+0

它取决于你如何指定它 - 默认情况下,每个方法都具有'Required'事务属性,这意味着如果存在已存在的事务,则使用它,如果它不存在则创建它。但是,您可以通过使用'javax.ejb.TransactionAttribute'注释来改变这种情况 - 例如,每次创建一个新的事务时,或者根本不应该使用任何事务。 – rapasoft

+0

我想为每个单独的方法调用(来自bean外部的调用)创建一个新的事务。我已经通过链接的文档,但我并不十分熟悉它。默认配置是否足够? – Rakim