Skip to content

Commit

Permalink
Merge pull request #116 from NextThought/114-for-4
Browse files Browse the repository at this point in the history
Clear Connection.transaction_manager on close. Fixes #114 for ZODB 4.
  • Loading branch information
jimfulton committed Sep 12, 2016
2 parents 27f3a17 + 760e22a commit f618bff
Show file tree
Hide file tree
Showing 3 changed files with 14 additions and 2 deletions.
5 changes: 5 additions & 0 deletions CHANGES.rst
Expand Up @@ -8,6 +8,11 @@
- Call _p_resolveConflict() even if a conflicting change doesn't change the
state. This reverts to the behaviour of 3.10.3 and older.

- Closing a Connection now reverts its ``transaction_manager`` to
None. This helps prevent errors and release resources when the
``transaction_manager`` was the (default) thread-local manager. See
`issue 114 <https://github.com/zopefoundation/ZODB/issues/114>`_.

4.4.3 (2016-08-04)
==================

Expand Down
8 changes: 7 additions & 1 deletion src/ZODB/Connection.py
Expand Up @@ -307,7 +307,9 @@ def close(self, primary=True):

self._debug_info = ()

if self.opened:
if self.opened and self.transaction_manager is not None:
# transaction_manager could be None if one of the __onCloseCallbacks
# closed the DB already, .e.g, ZODB.connection() does this.
self.transaction_manager.unregisterSynch(self)

if self._mvcc_storage:
Expand All @@ -333,6 +335,9 @@ def close(self, primary=True):
if am is not None:
am.closedConnection(self)

# Drop transaction manager to release resources and help prevent errors
self.transaction_manager = None

def db(self):
"""Returns a handle to the database this connection belongs to."""
return self._db
Expand Down Expand Up @@ -1119,6 +1124,7 @@ def _release_resources(self):
c._storage.release()
c._storage = c._normal_storage = None
c._cache = PickleCache(self, 0, 0)
c.transaction_manager = None

##########################################################################
# Python protocol
Expand Down
3 changes: 2 additions & 1 deletion src/ZODB/DB.py
Expand Up @@ -628,7 +628,8 @@ def close(self):

@self._connectionMap
def _(c):
c.transaction_manager.abort()
if c.transaction_manager is not None:
c.transaction_manager.abort()
c.afterCompletion = c.newTransaction = c.close = noop
c._release_resources()

Expand Down

0 comments on commit f618bff

Please sign in to comment.