Report an Issue

Transactions#

Create / interact with gcloud datastore transactions.

class gcloud.datastore.transaction.Transaction(client)[source]#

Bases: gcloud.datastore.batch.Batch

An abstraction representing datastore Transactions.

Transactions can be used to build up a bulk mutuation as well as provide isolation.

For example, the following snippet of code will put the two save operations (either insert_auto_id or upsert) into the same mutation, and execute those within a transaction:

>>> from gcloud import datastore

>>> with datastore.Transaction():
...     datastore.put_multi([entity1, entity2])

Because it derives from Batch, :class`Transaction` also provides put() and delete() methods:

>>> with datastore.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:

>>> with datastore.Transaction():
...     do_some_work()
...     raise SomeException()  # rolls back

If the transaction block exists 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:

>>> with datastore.Transaction():
...     entity = datastore.Entity(key=Key('Thing'))
...     datastore.put(entity)

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

>>> with datastore.Transaction():
...     entity = datastore.Entity(key=Key('Thing'))
...     datastore.put(entity)
...     assert entity.key.is_partial  # There is no ID on this key.
...
>>> assert not entity.key.is_partial  # There *is* an ID.

If you don’t want to use the context manager you can initialize a transaction manually:

>>> transaction = datastore.Transaction()
>>> transaction.begin()

>>> entity = datastore.Entity(key=Key('Thing'))
>>> transaction.put(entity)

>>> if error:
...     transaction.rollback()
... else:
...     transaction.commit()
Parameters:client (gcloud.datastore.client.Client) – The client used to connect to datastore.
begin()[source]#

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.

Raises:ValueError if the transaction has already begun.
commit()[source]#

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.
current()[source]#

Return the topmost transaction.

Note

if the topmost element on the stack is not a transaction, returns None.

Return type:gcloud.datastore.transaction.Transaction or None
id#

Getter for the transaction ID.

Return type:string
Returns:The ID of the current transaction.
rollback()[source]#

Rolls back the current transaction.

This method has necessary side-effects:

  • Sets the current connection’s transaction reference to None.
  • Sets the current transaction’s ID to None.