Create / interact with Google Cloud Datastore transactions.
Classes
Transaction
Transaction(client, read_only=False, read_time=None, begin_later=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.
Once you exit the transaction (or callcommit
), 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)
Parameters | |
---|---|
Name | Description |
client |
Client
the client used to connect to datastore. |
read_only |
bool
indicates the transaction is read only. |
read_time |
datetime
(Optional) Time at which the transaction reads entities. Only allowed when |
begin_later |
bool
(Optional) If True, the transaction will be started lazily (i.e. when the first RPC is made). If False, the transaction will be started as soon as the context manager is entered. |
Exceptions | |
---|---|
Type | Description |
`ValueError |
if read_time is specified when read_only=False . |