Module transaction (2.2.0)

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)
Parameters
NameDescription
client Client

the client used to connect to datastore.

read_only bool

indicates the transaction is read only.