Create / interact with Google Cloud Datastore transactions.
Classes
Transaction
Transaction(client, read_only=False)
An abstraction representing datastore Transactions.
Transactions can be used to build up a bulk mutation and ensure all or none succeed (transactionally).
For example, the following snippet of code will put the two save
operations (either insert
or upsert
) into the same
mutation, and execute those within a transaction:
.. testsetup:: txn
import uuid
from google.cloud import datastore
unique = str(uuid.uuid4())[0:8]
client = datastore.Client(namespace='ns{}'.format(unique))
.. doctest:: txn
>>> entity1 = datastore.Entity(client.key('EntityKind', 1234))
>>> entity2 = datastore.Entity(client.key('EntityKind', 2345))
>>> with client.transaction():
... client.put_multi([entity1, entity2])
Because it derives from xref_Batch,
Transaction
also provides put
and delete
methods:
.. doctest:: txn
with client.transaction() as xact: ... xact.put(entity1) ... xact.delete(entity2.key)
By default, the transaction is rolled back if the transaction block exits with an error:
.. doctest:: txn
>>> def do_some_work():
... return
>>> class SomeException(Exception):
... pass
>>> with client.transaction():
... do_some_work()
... raise SomeException # rolls back
Traceback (most recent call last):
...
SomeException
If the transaction block exits without an exception, it will commit by default.
.. warning::
Inside a transaction, automatically assigned IDs for
entities will not be available at save time! That means, if you
try:
.. doctest:: txn
>>> with client.transaction():
... thing1 = datastore.Entity(key=client.key('Thing'))
... client.put(thing1)
thing1
won't have a complete key until the transaction is
committed.
Once you exit the transaction (or call commit
), the
automatically generated ID will be assigned to the entity:
.. doctest:: txn
>>> with client.transaction():
... thing2 = datastore.Entity(key=client.key('Thing'))
... client.put(thing2)
... print(thing2.key.is_partial) # There is no ID on this key.
...
True
>>> print(thing2.key.is_partial) # There *is* an ID.
False
If you don't want to use the context manager you can initialize a transaction manually:
.. doctest:: txn
transaction = client.transaction() transaction.begin()
thing3 = datastore.Entity(key=client.key('Thing')) transaction.put(thing3)
transaction.commit()
.. testcleanup:: txn
with client.batch() as batch:
batch.delete(client.key('EntityKind', 1234))
batch.delete(client.key('EntityKind', 2345))
batch.delete(thing1.key)
batch.delete(thing2.key)
batch.delete(thing3.key)
Name | Description |
client |
Client
the client used to connect to datastore. |
read_only |
bool
indicates the transaction is read only. |