什么是Java EE中的事务?

时间:2017-01-11 20:05:46

标签: java jpa java-ee transactions

在我见过的每个来源中,交易被定义为一组成功或失败的操作。但是,在JPA中使用EntityManager,它似乎需要一个事务来保留我在内存中创建的单个实体。交易是什么意思?这个操作不是原子的吗?我怎么能回滚一个entity.persist()?在Java EE文档中是否有明确的概念定义?

2 个答案:

答案 0 :(得分:2)

认为EntityManager.persist()是原子的就像使用SQL并启用自动提交一样。事务用于创建原子操作,允许您将一行或多行插入一个或多个表作为单个原子操作,插入evertyhing或者没有任何内容插入

如果您没有进行交易,并且插入用户及其两个电话号码(两个表格),并且在插入第二个电话号码时出现问题,则您希望整个交易失败,而不是有不一致的数据。

如果您使用应用程序管理的EntityManager,则可以通过progammaticrally(EntityManager.getTransaction())控制事务,因此您可以控制哪些操作(插入/更新)应作为原子操作发生。

如果使用容器管理的EntityManager(Spring,JavaEE),那么事务是声明性的(@Transactional注释),因此事务基本上是方法范围的(通常通过多个方法调用传播)。

这只是交易时的冰山一角,还有隔离级别和序列化交易等其他内容,但让我们谈谈另一次:)

答案 1 :(得分:1)

  

这个操作不是原子的吗?我怎么能回滚一个   entity.persist()

它可能是也可能不是原子的。例如,如果您的实体与另一个具有CascadeType.PERSIST的实体有关系,或者使用辅助表,则需要多个SQL语句才能使其持久化。

EntityManager调用和SQL语句之间确实没有一对一的映射,两者都不需要在时间上重合。