回滚 JTA 事务
rollback on JTA Transactions
假设我有一个托管 bean 并且定义了一个 EntityManager
。我想知道交易是如何工作的,以及它们在各种不同情况下的行为方式。从文档中我了解到 flush()
实际上用于覆盖提交延迟并立即执行。因此,在下面的示例中,我希望 demo
在数据库中持久存在,而 demo2
不会。但似乎这一切都被视为单一交易(据我了解)。为什么会这样?为什么不需要 begin()
和 commit()
的进一步注释或休眠方法来定义事务的开始和结束?我觉得我在这里混淆了不同的东西......
@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();
}
}
当使用 Container managed transactions 时,所有会话 bean 默认都在 运行 事务中。这意味着,如果发生某些导致事务回滚的异常,则对 demo
的更改也会回滚。
这里有一些关于 flush()
工作原理的有用信息:https://en.wikibooks.org/wiki/Java_Persistence/Persisting#Flush
假设我有一个托管 bean 并且定义了一个 EntityManager
。我想知道交易是如何工作的,以及它们在各种不同情况下的行为方式。从文档中我了解到 flush()
实际上用于覆盖提交延迟并立即执行。因此,在下面的示例中,我希望 demo
在数据库中持久存在,而 demo2
不会。但似乎这一切都被视为单一交易(据我了解)。为什么会这样?为什么不需要 begin()
和 commit()
的进一步注释或休眠方法来定义事务的开始和结束?我觉得我在这里混淆了不同的东西......
@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();
}
}
当使用 Container managed transactions 时,所有会话 bean 默认都在 运行 事务中。这意味着,如果发生某些导致事务回滚的异常,则对 demo
的更改也会回滚。
这里有一些关于 flush()
工作原理的有用信息:https://en.wikibooks.org/wiki/Java_Persistence/Persisting#Flush