[
https://issues.apache.org/jira/browse/DELTASPIKE-900?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16601997#comment-16601997
]
ASF subversion and git services commented on DELTASPIKE-900:
------------------------------------------------------------
Commit 7bd3c1d53eeda4b8bc14656515ba7e885f2f6473 in deltaspike's branch
refs/heads/master from [~struberg]
[ https://git-wip-us.apache.org/repos/asf?p=deltaspike.git;h=7bd3c1d ]
DELTASPIKE-900 add unit test for multiple BM tx
> ResourceLocalTransactionStrategy not working with multiple EntityManagers
> -------------------------------------------------------------------------
>
> Key: DELTASPIKE-900
> URL: https://issues.apache.org/jira/browse/DELTASPIKE-900
> Project: DeltaSpike
> Issue Type: Bug
> Components: JPA-Module
> Affects Versions: 1.2.1, 1.3.0
> Reporter: Johannes Testori
> Assignee: Mark Struberg
> Priority: Major
>
> We are using CDI-ApplicationScoped services in a batch program with
> CdiControl. We started using multiple qualified EntityManagers in a single
> service annotated with @Transactional and encountered the problem that
> database changes are not committed. After some debugging we found the problem
> in the "execute"-method in ResourceLocalTransactionStrategy.
> for (Class<? extends Annotation> emQualifier : emQualifiers)
> {
> EntityManager entityManager =
> resolveEntityManagerForQualifier(emQualifier);
> EntityManagerEntry entityManagerEntry =
> createEntityManagerEntry(entityManager, emQualifier);
> transactionBeanStorage.storeUsedEntityManager(entityManagerEntry);
> EntityTransaction transaction = getTransaction(entityManagerEntry);
> if (!transaction.isActive())
> {
> beforeBegin(invocationContext, entityManagerEntry, transaction);
> transaction.begin();
> }
> else if (isOutermostInterceptor)
> {
> outermostTransactionAlreadyExisted = true;
> }
> //don't move it before EntityTransaction#begin() and invoke it in any case
> beforeProceed(invocationContext, entityManagerEntry, transaction);
> }
> A transaction is created for the first EntityManager. But since the same
> transaction is assigned to the other EntityManagers,
> "outermostTransactionAlreadyExisted" is set to true. This is the cause for
> the transaction not being committed afterwards:
> if (isOutermostInterceptor)
> {
> if (!outermostTransactionAlreadyExisted)
> {
> // We only commit transactions we opened ourselfs.
> // If the transaction got opened outside of our interceptor chain
> // we must not handle it.
> // This e.g. happens if a Stateless EJB invokes a Transactional CDI
> bean
> // which uses the BeanManagedUserTransactionStrategy.
> We've seen this problem in version 1.2.1 and 1.3.0. (didn't try other
> versions).
--
This message was sent by Atlassian JIRA
(v7.6.3#76005)