Commit 09010439 authored by Jim Fulton's avatar Jim Fulton Committed by GitHub

Merge pull request #115 from NextThought/clear-trans-man-on-close

Clear Connection.transaction_manager on close. Fixes #114
parents 163450a9 ca9939eb
...@@ -12,6 +12,11 @@ ...@@ -12,6 +12,11 @@
- Call _p_resolveConflict() even if a conflicting change doesn't change the - Call _p_resolveConflict() even if a conflicting change doesn't change the
state. This reverts to the behaviour of 3.10.3 and older. 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>`_.
5.0.0 (2016-09-06) 5.0.0 (2016-09-06)
================== ==================
......
...@@ -290,7 +290,9 @@ class Connection(ExportImport, object): ...@@ -290,7 +290,9 @@ class Connection(ExportImport, object):
self._debug_info = () 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) self.transaction_manager.unregisterSynch(self)
if primary: if primary:
...@@ -313,6 +315,9 @@ class Connection(ExportImport, object): ...@@ -313,6 +315,9 @@ class Connection(ExportImport, object):
if am is not None: if am is not None:
am.closedConnection(self) am.closedConnection(self)
# Drop transaction manager to release resources and help prevent errors
self.transaction_manager = None
def db(self): def db(self):
"""Returns a handle to the database this connection belongs to.""" """Returns a handle to the database this connection belongs to."""
return self._db return self._db
...@@ -906,6 +911,7 @@ class Connection(ExportImport, object): ...@@ -906,6 +911,7 @@ class Connection(ExportImport, object):
c._storage.release() c._storage.release()
c._storage = c._normal_storage = None c._storage = c._normal_storage = None
c._cache = PickleCache(self, 0, 0) c._cache = PickleCache(self, 0, 0)
c.transaction_manager = None
########################################################################## ##########################################################################
# Python protocol # Python protocol
......
...@@ -637,6 +637,7 @@ class DB(object): ...@@ -637,6 +637,7 @@ class DB(object):
@self._connectionMap @self._connectionMap
def _(c): def _(c):
if c.transaction_manager is not None:
c.transaction_manager.abort() c.transaction_manager.abort()
c.afterCompletion = c.newTransaction = c.close = noop c.afterCompletion = c.newTransaction = c.close = noop
c._release_resources() c._release_resources()
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment