java - java EE 中的事务是什么?

标签 java jpa jakarta-ee transactions

在我见过的每个来源中,事务都被定义为一组一起成功或一起失败的操作。然而,在 JPA 中使用 EntityManager 时,似乎甚至需要事务来持久保存我在内存中创建的单个实体。交易的意义是什么?这个操作不是已经是原子的了吗?如何回滚单个 entity.persist()? java EE 文档中是否有对该概念的明确定义?

最佳答案

认为 EntityManager.persist() 是原子的就像始终使用启用自动提交的 SQL 一样。事务用于创建原子操作,该操作允许您将一行或多行作为单个原子操作插入到一个或多个表中,要么插入所有内容,要么不插入任何内容。已插入。

如果你没有交易,并且你插入了一个用户和他的两个电话号码(两个表),并且当你插入第二个电话号码时出了问题,你希望整个交易失败,而不是不一致数据。

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

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

这只是事务方面的冰山一角,还有其他一些东西,例如隔离级别和序列化事务,但我们下次再讨论:)

关于java - java EE 中的事务是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41599801/

相关文章:

java - 在 @OneToMany 中的 hibernate 中删除 set null

java - JPA - 使用复合 PK 和 FK 并定义关系

Java - 顺序异步执行

java - findViewById(R.id.drawer_layout) 返回 null

java - Android - 使用扫描仪读取文件,如何获取文件

intellij-idea - 在intellij idea中设置aspectj weaver的编译级别

mysql - 尝试从 NetBeans 中的 jsp 连接到 MySQL 时访问被拒绝

java - 逐个字段的通用对象比较器

hibernate - 在 Hibernate JPA 中; OneToMany 如何过滤结果;因为我不想删除任何数据

java - J2EE 中的应用程序管理事务