Skip to content

Commit

Permalink
Merge pull request #202 from tseaver/136-rollback_on_exception-redux
Browse files Browse the repository at this point in the history
Fix #136: roll back transactions on exception (redux)
  • Loading branch information
silvolu committed Oct 2, 2014
2 parents daef27d + 8e09bfd commit 8a35a6b
Show file tree
Hide file tree
Showing 2 changed files with 13 additions and 16 deletions.
12 changes: 4 additions & 8 deletions gcloud/datastore/test_transaction.py
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,6 @@ def test_context_manager_no_raise(self):
self.assertEqual(xact.id(), None)

def test_context_manager_w_raise(self):
# See https://github.com/GoogleCloudPlatform/gcloud-python/issues/136
class Foo(Exception):
pass
_DATASET = 'DATASET'
Expand All @@ -127,13 +126,10 @@ class Foo(Exception):
self.assertTrue(connection._xact is xact)
raise Foo()
except Foo:
pass # XXX
# self.assertEqual(xact.id(), None)
# self.assertEqual(connection._rolled_back, _DATASET))
# self.assertEqual(connection._xact, None)
# XXX should *not* have committed
self.assertEqual(connection._committed, (_DATASET, mutation))
# self.assertEqual(connection._committed, None)
self.assertEqual(xact.id(), None)
self.assertEqual(connection._rolled_back, _DATASET)
self.assertEqual(connection._xact, None)
self.assertEqual(connection._committed, None)
self.assertTrue(connection._xact is None)
self.assertEqual(xact.id(), None)

Expand Down
17 changes: 9 additions & 8 deletions gcloud/datastore/transaction.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,18 +21,16 @@ class Transaction(object):
... entity1.save()
... entity2.save()
To rollback a transaction if there is an error::
By default, the transaction is rolled back if the transaction block
exits with an error::
>>> from gcloud import datastore
>>> dataset = datastore.get_dataset('dataset-id', email, key_path)
>>> with dataset.transaction() as t:
... try:
... do_some_work()
... entity1.save()
... except:
... t.rollback()
... do_some_work()
... raise Exception() # rolls back
If the transaction isn't rolled back,
If the transaction block exists without an exception,
it will commit by default.
.. warning::
Expand Down Expand Up @@ -249,4 +247,7 @@ def __enter__(self):
return self

def __exit__(self, exc_type, exc_val, exc_tb):
self.commit()
if exc_type is None:
self.commit()
else:
self.rollback()

0 comments on commit 8a35a6b

Please sign in to comment.