Fix transaction aspect's incorrect state after creating new context #23650
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
As aspects are singletons,
transactionManagerCache
andtransactionManager
inTransactionAspectSupport
are persistent. It's ok if context is not changing, but if new contexts gets created (in tests, for example), new transaction manager should be used.I faced it using Spring Data with repository's
@Transactional
set toMANDATORY
:Transactional
method is calledTransactionInterceptor
of SpringData repositoryTransactional
method is calledTransactionInterceptor
in SpringData repository fails to find transaction, because it uses different (new) transaction managerI fixed it with clearing cache every time aspect's bean is created (and also remove a null check for
txManager parameter
, because if it's null, it should cleartxManager field
and also setter's parameter markedNullable
) and created tests for that.I also had to change gradle settings for integration tests, because they were not processed by aspectj AND that fixed one strange test where aspects were not found in classpath.
To demonstrate the issue, I also created this repository, where the test which is run second always fails.