[hibernate-dev] new proposal for tx timeout handling using transaction DISASSOCIATING event notification...
Steve Ebersole
steve at hibernate.org
Tue Mar 10 12:30:11 EDT 2015
You confused me more :)
One the one had you say that we will use this fact of whether the
transaction has been disassociated to indicate whether the transaction is
completing normally (disassociated == true) or timed-out (disassociated ==
false). But at the same time you are saying that it is quite possible that
we could still receive the afterCompletion callback in the timed-out case
and have (disassociated == true) due to race conditions.
So what is this buying us?
On Tue, Mar 10, 2015 at 11:09 AM, Scott Marlow <smarlow at redhat.com> wrote:
>
>
> On 03/10/2015 11:44 AM, Steve Ebersole wrote:
>
>> Scott, I am not following. Pardon me if I am being dense :)
>>
>> Today, in our afterCompletion hooks we have code that, in the case of
>> rollback, tries to make a determination of whether the rollback is due
>> to a timeout or a "normal" rollback. If we deem a timeout occurred,
>> then we delay the afterCompletion processing.
>>
>
> Currently, in our afterCompletion hooks, the determining code isn't aware
> of the current/last application thread id. I think that we are only
> tracking the first thread id that is used with the Hibernate session but
> not the last thread id.
>
>
>> So how, specifically, would this be different in what you propose?
>>
>
> The new approach will not use thread id, instead in our afterCompletion
> call, we will have the TM level knowledge, of whether the application
> thread has called tx rollback/suspend/commit yet. If the application
> thread has called tx rollback/suspend/commit already, the afterCompletion
> call can safely clear managed entities from the session without violating
> concurrency concerns. If the application has not yet called tx
> rollback/suspend/commit yet, we need to defer the clearing of the Hibernate
> session, until the TM listener calls us back, to let us know that the
> application has called tx rollback/suspend/commit, at which time we can
> safely clear the Hibernate session without violating (Hibernate session)
> concurrency concerns.
>
>
>> Are you saying that with this listener approach, that the listener would
>> be notified of disassociation prior to the afterCompletion callback on
>> our RegisteredSynchronization? But in the timeout case, the
>> disassociation would happen later?
>>
>
> Yes. It is also possible that in the timeout case, that the
> disassociation will come first (e.g. if there is a race between the app
> committing the transaction and the reaper thread timing out) but more
> likely that the disassociation comes later for the timeout case.
>
> FYI, the TM level SPI changes [4][5] are still open for review.
>
> Scott
>
> [4] https://github.com/jbosstm/jboss-transaction-spi/pull/5
> [5] https://github.com/jbosstm/narayana/pull/810
>
>
>> On Mon, Mar 9, 2015 at 1:19 PM, Scott Marlow <smarlow at redhat.com
>> <mailto:smarlow at redhat.com>> wrote:
>>
>> With a proposed TM level listener, we will have an SPI for
>> notification
>> of when application threads associated with a JTA transaction, become
>> disassociated with the transaction (tm.commit/rollback/suspend time).
>> Having this knowledge in a synchronization callback, can determine
>> whether the persistence context should be cleared directly from the
>> Synchronization.afterCompletion(int) call or should be deferred until
>> the transaction is disassociated from the JTA transaction.
>>
>> This idea is based on a TM level listener approach that Tom Jenkinson
>> [1] suggested. Mike Musgrove has a "proof of concept" implementation
>> of
>> the suggested changes [2]. I did some testing with [3] to see if the
>> improvement helps with clearing entities that might still be in the
>> persistence context after a background tx timeout.
>>
>> I'm wondering if in the Hibernate ORM
>> Synchronization.afterCompletion(int status) implementation, in case
>> of
>> tx rollback, if we could defer the clearing of the Hibernate session
>> to
>> be handled by the JtaPlatform. This could be setup at
>> EntityManager.joinTransaction() time (if a new property like
>> "hibernate.transaction.defer_clear_session" is true). Perhaps via a
>> JtaPlatform.joinTransaction(EntityManager) registration call?
>>
>> Thoughts?
>>
>> Scott
>>
>> [1] https://developer.jboss.org/thread/252572?start=45&tstart=0
>>
>> [2]
>> https://github.com/mmusgrov/jboss-transaction-spi/blob/
>> threadDisassociationListener/src/main/java/org/jboss/tm/
>>
>> [3]
>> https://github.com/scottmarlow/wildfly/tree/
>> transactiontimeout_clientut_noejb_wildfly9_march5_2015
>>
>> _______________________________________________
>> hibernate-dev mailing list
>> hibernate-dev at lists.jboss.org <mailto:hibernate-dev at lists.jboss.org>
>> https://lists.jboss.org/mailman/listinfo/hibernate-dev
>>
>>
>>
More information about the hibernate-dev
mailing list