Commit transaction after early return #63
Merged
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.
Ever since #57 and
transaction
was made inline the API has allowed for non-label returns from a transaction block.This is problematic because it allows for uncommitted transactions.
The provided test case demonstrate the problem:
Note that changing
insertAndReturn
toreturn@transaction
works as expected, but sincetransaction
is inline thereturn
statement will exit theinsertAndReturn
function before the underlying connection gets committed.A potential solution could have been to mark
operation
as crossinline (like soinline fun <A> transaction(crossinline operation: (TransactionalSession) -> A): A
), but this would break support for coroutines within the transaction block.I altered the implementation to commit the transaction as part of the
finally
block instead and it seams to work for this example.