Open flea89 opened 1 year ago
I believe currently, transactions are designed to only work as part of a context manager
That said, I think it would be a good idea to re-structure it so that it can be used without a context manager, as in your example
I believe currently, transactions are designed to only work as part of a context manager
That said, I think it would be a good idea to re-structure it so that it can be used without a context manager, as in your example
The official documentation states:
This method is called automatically when entering a with statement, however it can be called explicitly if you don't want to use a context manager.
I'd suggest either changing the behaviour (which should be a matter of moving the logic from __enter__
to begin
or update the docs to reflect that the method is unsupported. Current behaviour fails in fairly hard-to-identify ways
Ok, good catch. I'll mark this as a bug again then. We should make sure to add tests for this use case as well
TL;DR : when using
trx.begin()
andtrx.commit()
the transactions don't behave as expected.Please refer to this merge request to see the bug highlighted in the test.
From a quick look at the code, the problem seems to be the transaction is not added to the
client._batch_stack
when the APIs are called explicitly._push_batch
an_pop_batch
are called only through the context manager__enter__
and__exit__
.Because of this
client.current_batch
andcurrent_transaction
Environment details
3.8.16
22.0.4
google-cloud-datastore
version:2.15.2
Steps to reproduce
client.transaction()
txn.begin()
entity_in_txn = client.get(key)
Commit the transaction
txn.commit()
The transaction should raise a
Conflit
but it doesn't. (When doing the same with the context manager the Exeption is raised, see hereCode example
See here
Stack trace