在我见过的每个来源中,交易被定义为一组成功或失败的操作。但是,在JPA中使用EntityManager
,它似乎需要一个事务来保留我在内存中创建的单个实体。交易是什么意思?这个操作不是原子的吗?我怎么能回滚一个entity.persist()
?在Java EE文档中是否有明确的概念定义?
答案 0 :(得分:2)
认为EntityManager.persist()
是原子的就像使用SQL并启用自动提交一样。事务用于创建原子操作,允许您将一行或多行插入一个或多个表作为单个原子操作,插入evertyhing或者没有任何内容插入
如果您没有进行交易,并且插入用户及其两个电话号码(两个表格),并且在插入第二个电话号码时出现问题,则您希望整个交易失败,而不是有不一致的数据。
如果您使用应用程序管理的EntityManager,则可以通过progammaticrally(EntityManager.getTransaction()
)控制事务,因此您可以控制哪些操作(插入/更新)应作为原子操作发生。
如果使用容器管理的EntityManager(Spring,JavaEE),那么事务是声明性的(@Transactional注释),因此事务基本上是方法范围的(通常通过多个方法调用传播)。
这只是交易时的冰山一角,还有隔离级别和序列化交易等其他内容,但让我们谈谈另一次:)
答案 1 :(得分:1)
这个操作不是原子的吗?我怎么能回滚一个
entity.persist()
?
它可能是也可能不是原子的。例如,如果您的实体与另一个具有CascadeType.PERSIST
的实体有关系,或者使用辅助表,则需要多个SQL语句才能使其持久化。
EntityManager
调用和SQL语句之间确实没有一对一的映射,两者都不需要在时间上重合。