-
Notifications
You must be signed in to change notification settings - Fork 38.5k
Rollback of transaction participating in nested transaction should not enforce rollback of global transaction [SPR-6568] #11234
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Comments
jean commented Was is the status with Spring 3.x?? |
Clemens Schneider commented You could vote on the issue. |
Stéphane Nicoll commented which transaction manager are you using? You should use
My best guess at this point is that you are facing those limitations which explains why you're not getting the proper transaction boundaries you'd expect |
Clemens Schneider commented The underlying transaction-manager was indeed a DataSource-based one. |
siedlp01 commented I'm facing the same issue at the moment. My scenario is the outer transaction boundary has a propagation of PROPAGATION_REQUIRED which causes the transaction to be started. In this transaction I am processing several tasks. If an error should occur during a single task, I do not want the whole transaction to be rolled back, therefore I wrap the task processing in another transaction boundary with a propagation of PROPAGATION_NESTED. Everything works as expected if a runtime exception is thrown from inside the nested transaction. The nested transaction is rolled-back to the save-point, and processing can continue to the next task. The problem comes when, during task processing, calls are made to existing service methods defined with a transaction boundary of PROPAGATION_REQUIRED. Any runtime exceptions thrown from these methods cause the underlying connection to be marked as rollback-only, rather than respecting the current parent transaction nested propagation. The result is that the nested transaction is rolled-back to the save-point, but the existing outer transaction can never be committed. It seems to make more sense to me that rolling back on exception from a PROPAGATION_REQUIRED transactional boundary should respect the propagation of any pre-existing parental transactional contexts. |
Juergen Hoeller commented Indeed, this is unintuitive. While setting |
Juergen Hoeller commented As of Spring Framework 5.0, nested transactions resolve their rollback-only status on a rollback to a savepoint, not applying it to the global transaction anymore. This required some subtle refinements in On older versions, the recommended workaround is to switch |
Clemens Schneider opened SPR-6568 and commented
In my scenario, I have a global transaction (PROPAGATION_REQUIRED) in which I start a nested transaction (PROPAGATION_NESTED) in which I start another transaction (PROPAGATION_REQUIRED). A RuntimeException is thrown inside the most inner transaction and is caught inside the most outer transaction. Now I would expect that only the most inner and the nested transaction get rolled back to its savepoints but instead the whole transaction gets marked as rollbackOnly which gets me an UnexpectedRollbackException.
A fix would be to set the globalRollbackOnParticipationFailure flag of the platform transaction manager to false, but in general, this behaviour is desired in our application.
Wouldn't it be possible somehow to check in the inner transaction if there is another nested transaction active and if this is the case, to not mark the transaction as rollbackOnly?
Simply put:
PROPAGATION_REQUIRED {
try {
PROPAGATION_NESTED {
PROPAGATION_REQUIRED {
throws RuntimeException(); // causes whole transaction to rollback
}
}
} catch (RuntimeException) {
// handle here without re-throwing
}
}
Affects: 2.5.5
Issue Links:
Referenced from: commits 0f51ff5
3 votes, 5 watchers
The text was updated successfully, but these errors were encountered: