Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 多个事务不应该与em.getTransaction()一致吗?_Java_Transactions_Jpa 2.0_Eclipselink_Derby - Fatal编程技术网

Java 多个事务不应该与em.getTransaction()一致吗?

Java 多个事务不应该与em.getTransaction()一致吗?,java,transactions,jpa-2.0,eclipselink,derby,Java,Transactions,Jpa 2.0,Eclipselink,Derby,当我执行: 公开无效开始生效{ em.getTransaction.begin; } 在以相同方式启动活动事务后,我得到以下异常: 异常说明:事务当前处于活动状态 java.lang.IllegalStateException: 异常说明:事务当前处于活动状态 位于org.eclipse.persistence.internal.jpa.transaction.EntityTransactionImpl.BeginetityTransactionImpl.java:45 位于com.mysimp

当我执行:

公开无效开始生效{ em.getTransaction.begin; } 在以相同方式启动活动事务后,我得到以下异常:

异常说明:事务当前处于活动状态 java.lang.IllegalStateException: 异常说明:事务当前处于活动状态 位于org.eclipse.persistence.internal.jpa.transaction.EntityTransactionImpl.BeginetityTransactionImpl.java:45 位于com.mysimpatico.memoplation.persistence.Database.beginTransactionDatabase.java:44 位于com.mysimpatico.memoplation.persistence.tests.PersistenceTest.setUpPersistenceTest.java:39 底层DBMS是嵌入式ApacheDerby,据我所知,它不支持来自不同JVM的多个连接,但支持并发事务

此测试代码失败:

public int getNofinal类entityClass{ 最终CriteriaBuilder qb=em.getCriteriaBuilder; 最终标准查询cq=qb.createQueryLong.class; cq.selectqb.countcq.fromentityClass; final int ret=em.createQuerycq.getSingleResult.intValue; 返回ret; } 受保护的void insertwords最终列表表达式deftriples,MUser usr,final meanings数据库mengsDB抛出异常{ 对于字符串[]expressionDefTriples:expressionDefTriples{ mengsDB.persistenymesmeaningsdatabase.toenummapexpressioneftriple,usr; TestSynonymSpersInstanceExpressionDefTriple,mengsDB; } } 受保护的void testSynonymsPersistancefinal字符串[]expdeftree,最终含义数据库mengsDB{ 最终表达式exp=mengsDB.getExpression.class,expdeftree[0]; testGenderexp,expdeftree[2]; 最终表达式def=mengsDB.getExpression.class,expdeftree[1]; 资产负债表; assertTrueexp.getMengs.size>0; assertTruedef.getMengs.size>0; assertTruemengsDB.getNoMeaning.class>0;//此处失败 } public void persistensynonymsFinal EnumMap输入引发MultiplementsException{ 最终表达式def=extractExpinput,Input.definition; 最终表达式exp=extractExpinput,Input.Expression; 最终MUser usr=提取usrinput; 开始呼吸; 最终含义meng=persistMengexp、usr、def; 承诺交易; 信号可用性; logInsertionmeng、exp、def; } 本质上,我在同一个em中启动并提交一个事务,但是当我使用同一个em执行getNo方法时,它找不到前一个em提交的内容。我看不出问题出在哪里。这显然是一个问题,因为像em.find这样的“本地”代码。。查找已提交的更改,但不查找条件查询。

实际上返回当前更改,并且在事务已处于活动状态时无法调用:

/**
* Start a resource transaction.
* @throws IllegalStateException if isActive() is true
*/
public void begin();
您可以做的是创建javadoc中暗示的串行本地事务:

总之,JPA和JTA不支持

工具书类 JPA2.0规范 第3.1.1节实体管理器接口 第7.5.3节实体事务接口 JPA维基书籍
所以JPA不支持并发事务,只支持事务的串行执行。我理解正确吗?如果在我的应用程序中是这样,我应该锁定事务以保证串行执行。@simpatico JPA支持并发事务。但是您试图做的是事务嵌套,而这是不受支持的。那么,我如何处理多个事务呢?多个ems?@simpatico如果你真的需要,可以。我已经在问题中添加了后续代码。这仍然是事务嵌套吗?
/**
 * Return the resource-level <code>EntityTransaction</code> object.
 * The <code>EntityTransaction</code> instance may be used serially to
 * begin and commit multiple transactions.
 * @return EntityTransaction instance
 * @throws IllegalStateException if invoked on a JTA
 *         entity manager
 */
public EntityTransaction getTransaction();