考虑一下我正在使用的一些代码的简化视图:
@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
根本不被用于SecondEjbType
或ThirdEjbType
…既没有类,也没有方法的水平。我明白这意味着secondEjb.doSomething()
并thirdEjb.doSomething()
会为双方提供的事务中进行操作firstEjb.doSomething()
。
但是,我严重错过了 某些东西 !如代码注释所示,…
secondEjb
将数据写入数据库,然后thirdEjb
读取该数据作为其操作的一部分。由于所有这些都在同一个事务中运行,因此我不希望隔离级别有任何问题。
但是,无论出于何种原因,secondEjb
数据库写操作都不可见thirdEjb
。
我一直跟踪到最大,并且显然没有异常,错误或回退问题……后续的读取根本看不到初始写入。我并没有声称自己是交易管理领域的世界上最伟大的专家……我错过了显而易见的事情吗,或者我的概念理解基本上是正确的,而问题可能出在其他地方吗?
<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): 一个事务执行过程中看到的数据, 总是跟这个事务在启动时看到的数据是一致的. 当然在可重复