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();
}
}
如何“交易中”规定的?每次方法调用都有单个事务吗?如果有两个呼叫彼此无关,第二个呼叫失败,会怎么样呢?第一个也会回滚吗? – Rakim
它取决于你如何指定它 - 默认情况下,每个方法都具有'Required'事务属性,这意味着如果存在已存在的事务,则使用它,如果它不存在则创建它。但是,您可以通过使用'javax.ejb.TransactionAttribute'注释来改变这种情况 - 例如,每次创建一个新的事务时,或者根本不应该使用任何事务。 – rapasoft
我想为每个单独的方法调用(来自bean外部的调用)创建一个新的事务。我已经通过链接的文档,但我并不十分熟悉它。默认配置是否足够? – Rakim