From fab8bb4b5f56ae20cceaa419a45f2d0a4182a206 Mon Sep 17 00:00:00 2001
From: Andrew Svetlov <andrew.svetlov@gmail.com>
Date: Fri, 31 Oct 2014 20:49:02 +0200
Subject: [PATCH] Fix a bug for processing transactions in line.

---
 CHANGES.txt                  |  5 +++++
 aiopg/sa/connection.py       |  1 +
 tests/test_sa_transaction.py | 29 +++++++++++++++++++++++++++++
 3 files changed, 35 insertions(+)

diff --git a/CHANGES.txt b/CHANGES.txt
index e78bddca..c25b4a07 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,6 +1,11 @@
 CHANGES
 -------
 
+0.5.1 (2014-10-31)
+^^^^^^^^^^^^^^^^^^
+
+* Fix a bug for processing transactions in line.
+
 0.5.0 (2014-10-31)
 ^^^^^^^^^^^^^^^^^^
 
diff --git a/aiopg/sa/connection.py b/aiopg/sa/connection.py
index 60b7dfc3..418b2add 100644
--- a/aiopg/sa/connection.py
+++ b/aiopg/sa/connection.py
@@ -170,6 +170,7 @@ def _commit_impl(self):
             yield from cur.execute('COMMIT')
         finally:
             cur.close()
+            self._transaction = None
 
     @asyncio.coroutine
     def _rollback_impl(self):
diff --git a/tests/test_sa_transaction.py b/tests/test_sa_transaction.py
index 3528f584..b5aef88b 100644
--- a/tests/test_sa_transaction.py
+++ b/tests/test_sa_transaction.py
@@ -390,3 +390,32 @@ def go():
             yield from tr.commit()
 
         self.loop.run_until_complete(go())
+
+    def test_transactions_sequence(self):
+        @asyncio.coroutine
+        def go():
+            conn = yield from self.connect()
+
+            yield from conn.execute(tbl.delete())
+
+            self.assertIsNone(conn._transaction)
+
+            tr1 = yield from conn.begin()
+            self.assertIs(tr1, conn._transaction)
+            yield from conn.execute(tbl.insert().values(name='a'))
+            res1 = yield from conn.scalar(tbl.count())
+            self.assertEqual(1, res1)
+
+            yield from tr1.commit()
+            self.assertIsNone(conn._transaction)
+
+            tr2 = yield from conn.begin()
+            self.assertIs(tr2, conn._transaction)
+            yield from conn.execute(tbl.insert().values(name='b'))
+            res2 = yield from conn.scalar(tbl.count())
+            self.assertEqual(2, res2)
+
+            yield from tr2.commit()
+            self.assertIsNone(conn._transaction)
+
+        self.loop.run_until_complete(go())