当前位置: 首页 > 面试题库 >

了解EJB3 / JPA容器级别的事务和隔离级别

锺离逸春
2023-03-14
问题内容

考虑一下我正在使用的一些代码的简化视图:

@Stateless(...)
@Remote(...)
@TransactionAttribute(TransactionAttributeType.MANDATORY)
public class FirstEjbType {

   @EJB(...)
   private SecondEjbType secondEjb;
   @EJB(...)
   private ThirdEjbType thirdEjb;

   public void doSomething() {
      secondEjb.doSomething();  // WRITES SOMETHING TO THE DATABASE
      thirdEjb.doSomething();  // CAN'T SEE THAT SOMETHING IN THE DATABASE!
}

我已经在类级别设置了TransactionAttribute注释MANDATORY。我理解这意味着doSomething()必须在提供的事务中调用诸如之类的所有方法。在这种情况下,我们正在使用容器管理的事务。

TransactionAttribute根本不被用于SecondEjbTypeThirdEjbType…既没有类,也没有方法的水平。我明白这意味着secondEjb.doSomething()thirdEjb.doSomething()会为双方提供的事务中进行操作firstEjb.doSomething()

但是,我严重错过了 某些东西 !如代码注释所示,…
secondEjb将数据写入数据库,然后thirdEjb读取该数据作为其操作的一部分。由于所有这些都在同一个事务中运行,因此我不希望隔离级别有任何问题。
但是,无论出于何种原因,secondEjb数据库写操作都不可见thirdEjb

我一直跟踪到最大,并且显然没有异常,错误或回退问题……后续的读取根本看不到初始写入。我并没有声称自己是交易管理领域的世界上最伟大的专家……我错过了显而易见的事情吗,或者我的概念理解基本上是正确的,而问题可能出在其他地方吗?

更新-johnstok请求的其他信息如下:

  • 我在GlassFish中运行
  • 我不确定“非标准冲洗模式”是什么意思,所以我认为答案是否定的。
  • 我的persistence.xml文件如下所示:

<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="1.0">
<persistence-unit name="pu" transaction-type="JTA">
<jta-data-source>jdbc/datasource</jta-data-source>
<exclude-unlisted-classes>false</exclude-unlisted-classes>
<properties>
<property name="toplink.cache.shared.default" value="false"/>
</properties>
</persistence-unit>
</persistence>


问题答案:

我从这里的所有答案中学到了很多东西,也无法对别人表示感谢。但是,我认为我的问题使问题陷入泥潭,最好从另一个问题重新开始。

从一个EJB跳到另一个EJB似乎没有任何关系。为了简化问题,我尝试使用完全隔离到一个EJB的测试用例。我进入了该secondEjb.doSomething()方法,该方法将实体保留到数据库中。在该方法的末尾,我添加了一个em.flush(),并尝试通过JPA查询再次检索该实体。

即使我 仍然使用 保留实体的完全相同的方法
,但对于随后的查询却不可见。我在其他地方做了一些其他研究,看起来这可能只是事务上下文中JPA的正常隔离模式。一个事务启动后,该事务中的其他查询尚无法查看未提交的数据。

如果我对链接的CodeRanch讨论的摘要是正确的,那么请在JPA上“ y”!:)无论哪种方式,我都重构了代码,以完全避免此问题。



 类似资料:
  • 本文向大家介绍MySQL四种事务隔离级别详解,包括了MySQL四种事务隔离级别详解的使用技巧和注意事项,需要的朋友参考一下 本文实验的测试环境:Windows 10+cmd+MySQL5.6.36+InnoDB 一、事务的基本要素(ACID)   1、原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节。事务执行过程中出错,会回滚到事务开始前的状态,所

  • 我有一个对具有 SQL API 的 Cosmos 容器的长期运行查询,该查询需要 10 分钟以上才能完成。有没有办法将数据库的隔离级别设置为“可重复读取”或“可序列化”,以避免幻像读取,如这里所定义的那样? 我知道我们可以为 Cosmos DB 设置一致性级别,但它仅适用于地质副本之间的读/写一致性,而不适用于事务隔离。

  • 主要内容:事务概述,事务的四大特性,并发事务问题,事务的隔离级别,演示:,总结事务概述 事务是一个或一组sql语句组成的一个执行单元,这个执行单元要么全部执行成功,要么全部执行失败。用于保证数据的完整性。 如账户转账,张三给李四转500,对应的sql语句应该是update张三的 余额-500,并且update李四的余额+500,如果先更新完张三的数据,然后出现了异常,导致李四的余额修改不了,那么就出现数据上的问题了,应该使用事务来解决这一问题,当中间出现异常后回滚,让张三的

  • 本文向大家介绍事务的隔离级别有哪些?相关面试题,主要包含被问及事务的隔离级别有哪些?时的应答技巧和注意事项,需要的朋友参考一下 SQL 标准定义了四个隔离级别: READ-UNCOMMITTED(读取未提交): 最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读。 READ-COMMITTED(读取已提交): 允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重

  • 我将spring应用程序连接到smartbaer servicev,在那里创建了虚拟数据源(Postgres)。 驱动程序类: 连接字符串(本地servicev虚拟服务器url): 应用程序.属性:- spring.datasource.driver-class-name=com.smartbear.servicev.jdbc.driver.jdbcvirtdriver spring.dataso

  • 本文向大家介绍MySQL的默认事务隔离级别是?相关面试题,主要包含被问及MySQL的默认事务隔离级别是?时的应答技巧和注意事项,需要的朋友参考一下 读未提交(RU): 一个事务还没提交时, 它做的变更就能被别的事务看到. 读提交(RC): 一个事务提交之后, 它做的变更才会被其他事务看到. 可重复读(RR): 一个事务执行过程中看到的数据, 总是跟这个事务在启动时看到的数据是一致的. 当然在可重复