Fix Transaction already completed issue #29065
Closed
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.
I have encountered an issue when using Reactive Transactions with PostgreSQL in Serialized Isolation mode, that when commit fails with ConcurrencyFailureException, TransactionalOperator actually tries to call rollback on the transaction.
The issue is that in ReactiveTransactionManager#rollback method, it is stated in case if commit threw an exception - you should not call the rollback method.
Currently when ReactiveTransactionManager#commit fails, the TransactionalOperator actually calls the rollbackOnException and it causes the rollback method to throw IllegalTransactionStateException with message about the transaction already being complete.
My proposal to fix this, is to wrap and exceptions that rise from commit phase in Flux/Mono.whenUsing into a special TransactionCommitException that allows us the decide weather to rollback or no, and also propagate it upstream so that client could decide to retry on such an occasion.