考虑一下我正在使用的一些代码的简化视图:
@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().在这种情况下,我们使用容器管理的事务.
在SecondEjbType或ThirdEjbType中根本不使用TransactionAttribute ……在类和方法级别都没有.我理解这意味着secondEjb.doSomething()和thirdEjb.doSomething()都将在为firstEjb.doSomething()提供的事务中运行.
但是,我真的错过了什么!如代码注释所示… secondEjb将数据写入数据库,thirdEjb将该数据作为其操作的一部分进行读取.由于所有这些都在同一个事务中运行,我不希望隔离级别存在任何问题.但是,无论出于何种原因,secondEjb数据库写入对thirdEjb不可见.
我已经将跟踪一直转到最大值,并且显然没有异常或错误或回滚问题……初始写入对后续读取不可见.我并不认为自己是交易管理方面世界上最伟大的大师…我是否错过了一些明显的东西,或者我的概念理解基本正确,问题可能在其他地方?
更新 – 约翰斯托克要求的其他信息如下:
>我在GlassFish中运行
>我不确定你的意思是“非标准冲洗模式”,所以我认为答案是否定的.
>我的persistence.xml文件如下所示:
< persistence xmlns =“http://java.sun.com/xml/ns/persistence”version =“1.0”>
< persistence-unit name =“pu”transaction-type =“JTA”>
< JTA-数据源> JDBC /数据源< / JTA-数据源>
<排除-不公开的类>假LT; /排除-不公开的类>
<性状>
< property name =“toplink.cache.shared.default”value =“false”/>
< /性状>
< /持久性单元>
< /持久>