diff --git a/gcloud/datastore/test_transaction.py b/gcloud/datastore/test_transaction.py index b0841489a158..3a7080a3f1db 100644 --- a/gcloud/datastore/test_transaction.py +++ b/gcloud/datastore/test_transaction.py @@ -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' @@ -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) diff --git a/gcloud/datastore/transaction.py b/gcloud/datastore/transaction.py index c8cf88979e05..50e1cf957589 100644 --- a/gcloud/datastore/transaction.py +++ b/gcloud/datastore/transaction.py @@ -21,18 +21,15 @@ class Transaction(object): ... entity1.save() ... entity2.save() - To rollback a transaction if there is an error:: + By default, the transaction is rolled back is 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:: @@ -249,4 +246,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()