summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy/engine/base.py
diff options
context:
space:
mode:
Diffstat (limited to 'lib/sqlalchemy/engine/base.py')
-rw-r--r--lib/sqlalchemy/engine/base.py24
1 files changed, 21 insertions, 3 deletions
diff --git a/lib/sqlalchemy/engine/base.py b/lib/sqlalchemy/engine/base.py
index a2066de4a..ed0586cc7 100644
--- a/lib/sqlalchemy/engine/base.py
+++ b/lib/sqlalchemy/engine/base.py
@@ -689,6 +689,7 @@ class Connection(Connectable):
self._autobegin()
else:
self._transaction = RootTransaction(self)
+ self.connection._reset_agent = self._transaction
return self._transaction
trans = NestedTransaction(self, self._transaction)
@@ -819,10 +820,27 @@ class Connection(Connectable):
if trans._is_root:
assert trans._parent is trans
self._transaction = None
+
+ # test suite w/ SingletonThreadPool will have cases
+ # where _reset_agent is on a different Connection
+ # entirely so we can't assert this here.
+ # if (
+ # not self._is_future
+ # and self._still_open_and_connection_is_valid
+ # ):
+ # assert self.__connection._reset_agent is None
else:
assert trans._parent is not trans
self._transaction = trans._parent
+ # not doing this assertion for now, however this is how
+ # it would look:
+ # if self._still_open_and_connection_is_valid:
+ # trans = self._transaction
+ # while not trans._is_root:
+ # trans = trans._parent
+ # assert self.__connection._reset_agent is trans
+
def _rollback_to_savepoint_impl(
self, name, context, deactivate_only=False
):
@@ -1965,10 +1983,10 @@ class Transaction(object):
an enclosing transaction.
"""
- if not self._parent.is_active:
- return
- if self._parent is self:
+
+ if self._parent.is_active and self._parent is self:
self.rollback()
+ self.connection._discard_transaction(self)
def rollback(self):
"""Roll back this :class:`.Transaction`.