summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy
diff options
context:
space:
mode:
Diffstat (limited to 'lib/sqlalchemy')
-rw-r--r--lib/sqlalchemy/orm/session.py39
1 files changed, 24 insertions, 15 deletions
diff --git a/lib/sqlalchemy/orm/session.py b/lib/sqlalchemy/orm/session.py
index ac495f321..e331e2512 100644
--- a/lib/sqlalchemy/orm/session.py
+++ b/lib/sqlalchemy/orm/session.py
@@ -415,6 +415,7 @@ class SessionTransaction(object):
)
return self._connections[bind][0]
+ local_connect = False
if self._parent:
conn = self._parent._connection_for_bind(bind, execution_options)
if not self.nested:
@@ -429,24 +430,32 @@ class SessionTransaction(object):
)
else:
conn = bind.connect()
+ local_connect = True
- if execution_options:
- conn = conn.execution_options(**execution_options)
+ try:
+ if execution_options:
+ conn = conn.execution_options(**execution_options)
- if self.session.twophase and self._parent is None:
- transaction = conn.begin_twophase()
- elif self.nested:
- transaction = conn.begin_nested()
+ if self.session.twophase and self._parent is None:
+ transaction = conn.begin_twophase()
+ elif self.nested:
+ transaction = conn.begin_nested()
+ else:
+ transaction = conn.begin()
+ except:
+ # connection will not not be associated with this Session;
+ # close it immediately so that it isn't closed under GC
+ if local_connect:
+ conn.close()
+ raise
else:
- transaction = conn.begin()
-
- self._connections[conn] = self._connections[conn.engine] = (
- conn,
- transaction,
- conn is not bind,
- )
- self.session.dispatch.after_begin(self.session, self, conn)
- return conn
+ self._connections[conn] = self._connections[conn.engine] = (
+ conn,
+ transaction,
+ conn is not bind,
+ )
+ self.session.dispatch.after_begin(self.session, self, conn)
+ return conn
def prepare(self):
if self._parent is not None or not self.session.twophase: