我一直对 transaction.rollback
感到困惑。这是示例伪代码:
transaction = session.beginTransaction()
EntityA a = new EntityA();
session.save(a);
session.flush();
transaction.rollback();
当这段代码有效时会发生什么?我是否在数据库中有实体?
最佳答案
简短回答:不,您不会在数据库中拥有实体。
更长的答案:在您的情况下,hibernate 足够聪明,不会向数据库发送插入/更新,直到它知道事务是否将被提交或回滚(尽管可以通过设置不同的 FlushMode 来更改此行为)通过调用flush,您将强制将SQL发送到数据库,但您仍然有数据库事务来保护您,当您调用回滚时,数据库事务将被回滚,删除其内部执行的更改,因此实际上不会保存任何内容。请注意,根据您配置的事务隔离级别,其他事务可能会以某种方式看到您在保存和回滚之间短暂保存的 EntityA。 另请注意,当您尝试从 DB 读取时,会自动调用 flush,在 99% 的情况下,不需要显式调用它。想到的一个异常(exception)是使用自动回滚测试进行单元测试时。
关于java - Hibernate 事务回滚是否会删除 "session.flush()"ed 实体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9908082/