Class Transaction (2.20.0)

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 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

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 read_only=True. This feature is in private preview.

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. self.begin() can also be called manually to begin the transaction at any time. Default is False.

Properties

database

Getter for database in which the batch will run.

Returns
Type Description
str The database in which the batch will run.

id

Getter for the transaction ID.

Returns
Type Description
bytes or None The ID of the current transaction, or None if not started.

mutations

Getter for the changes accumulated by this batch.

Every batch is committed with a single commit request containing all the work to be done as mutations. Inside a batch, calling put with an entity, or delete with a key, builds up the request by adding a new mutation. This getter returns the protobuf that has been built-up so far.

Returns
Type Description
iterable The list of .datastore_pb2.Mutation protobufs to be sent in the commit request.

namespace

Getter for namespace in which the batch will run.

Returns
Type Description
str The namespace in which the batch will run.

project

Getter for project in which the batch will run.

Returns
Type Description
str The project in which the batch will run.

Methods

begin

begin(retry=None, timeout=None)

Begins a transaction.

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.

Parameters
Name Description
retry google.api_core.retry.Retry

A retry object used to retry requests. If None is specified, requests will be retried using a default configuration.

timeout float

Time, in seconds, to wait for the request to complete. Note that if retry is specified, the timeout applies to each individual attempt.

Exceptions
Type Description
`exceptions.ValueError if the transaction has already begun.

commit

commit(retry=None, timeout=None)

Commits the transaction.

This is called automatically upon exiting a with statement, however it can be called explicitly if you don't want to use a context manager.

This method has necessary side-effects:

  • Sets the current transaction's ID to None.
Parameters
Name Description
retry google.api_core.retry.Retry

A retry object used to retry requests. If None is specified, requests will be retried using a default configuration.

timeout float

Time, in seconds, to wait for the request to complete. Note that if retry is specified, the timeout applies to each individual attempt.

current

current()

Return the topmost transaction.

Returns
Type Description
Transaction or None The current transaction (if any are active).

delete

delete(key)

Remember a key to be deleted during commit.

Parameter
Name Description
key Key

the key to be deleted.

Exceptions
Type Description
`exceptions.ValueError if the batch is not in progress, if key is not complete, or if the key's project does not match ours.

put

put(entity)

Adds an entity to be committed.

Ensures the transaction is not marked readonly. Please see documentation at xref_put

Parameter
Name Description
entity Entity

the entity to be saved.

Exceptions
Type Description
`RuntimeError if the transaction is marked ReadOnly

rollback

rollback(retry=None, timeout=None)

Rolls back the current transaction.

This method has necessary side-effects:

  • Sets the current transaction's ID to None.
Parameters
Name Description
retry google.api_core.retry.Retry

A retry object used to retry requests. If None is specified, requests will be retried using a default configuration.

timeout float

Time, in seconds, to wait for the request to complete. Note that if retry is specified, the timeout applies to each individual attempt.