java - JTA 事务回滚

标签 java hibernate transactions glassfish

假设我有一个托管 bean 并且定义了一个 EntityManager。我想知道交易是如何运作的以及它们在各种不同情况下的表现如何。从文档中我了解到,flush()实际上用于覆盖提交上的延迟并立即执行。因此,在下面的示例中,我希望 demo 能够保留在数据库中,而 demo2 则不会。但似乎这一切都被视为单个交易(根据我的理解)。为什么会发生这种情况?为什么不需要进一步的注释或 hibernate 方法 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时默认情况下,所有 session bean 都在事务内运行。这意味着,如果发生导致事务回滚的异常,对 demo 的更改也会回滚。

以下是有关 flush() 工作原理的一些有用信息:https://en.wikibooks.org/wiki/Java_Persistence/Persisting#Flush

关于java - JTA 事务回滚,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37003665/

相关文章:

java - 是否可以合并同等大小的mp3格式文件,然后在Java中检索、修改每个单元文件并添加新的文件?

java - JPA @ManyToOne @JoinFormula 抛出 ClassCastException

transactions - Neo4j 中的读取隔离

transactions - 事件溯源中的事务处理

c# - 错误: The ROLLBACK TRANSACTION request has no corresponding BEGIN TRANSACTION

java - 抽象类和构造函数问题以及这个 UML 图

java - 如何在 Netbeans 11 中使用 Maven 和 Inno Setup 为 JavaFX 应用程序创建可执行安装程序

java - 动态转换类

mysql - Hibernate 的 hbm2ddl 不适本地创建唯一索引的问题

java - 如何使用H2和JPA创建数据库备份?