summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy
diff options
context:
space:
mode:
authormike bayer <mike_mp@zzzcomputing.com>2021-01-16 01:14:54 +0000
committerGerrit Code Review <gerrit@bbpush.zzzcomputing.com>2021-01-16 01:14:54 +0000
commit3e40a232a025b770488c9d4940d284e3f7cdba24 (patch)
treee0e27acfd811e3d05b6873e94a4a3d99a78c4352 /lib/sqlalchemy
parentf898ef162da65a3755d25ee194885677c880c91f (diff)
parentc5b4af959e13f8214121f62f322c668bb178d41f (diff)
downloadsqlalchemy-3e40a232a025b770488c9d4940d284e3f7cdba24.tar.gz
Merge "Guard against re-entrant autobegin in Core, ORM"
Diffstat (limited to 'lib/sqlalchemy')
-rw-r--r--lib/sqlalchemy/engine/base.py3
-rw-r--r--lib/sqlalchemy/orm/session.py12
-rw-r--r--lib/sqlalchemy/testing/fixtures.py2
3 files changed, 12 insertions, 5 deletions
diff --git a/lib/sqlalchemy/engine/base.py b/lib/sqlalchemy/engine/base.py
index 72d66b7c8..31bf885db 100644
--- a/lib/sqlalchemy/engine/base.py
+++ b/lib/sqlalchemy/engine/base.py
@@ -813,10 +813,11 @@ class Connection(Connectable):
if self._echo:
self.engine.logger.info("BEGIN (implicit)")
+ self.__in_begin = True
+
if self._has_events or self.engine._has_events:
self.dispatch.begin(self)
- self.__in_begin = True
try:
self.engine.dialect.do_begin(self.connection)
except BaseException as e:
diff --git a/lib/sqlalchemy/orm/session.py b/lib/sqlalchemy/orm/session.py
index e8312f393..8a7a64f78 100644
--- a/lib/sqlalchemy/orm/session.py
+++ b/lib/sqlalchemy/orm/session.py
@@ -531,6 +531,10 @@ class SessionTransaction(object):
self._take_snapshot(autobegin=autobegin)
+ # make sure transaction is assigned before we call the
+ # dispatch
+ self.session._transaction = self
+
self.session.dispatch.after_transaction_create(self.session, self)
@property
@@ -1242,7 +1246,8 @@ class Session(_SessionClassMethods):
def _autobegin(self):
if not self.autocommit and self._transaction is None:
- self._transaction = SessionTransaction(self, autobegin=True)
+ trans = SessionTransaction(self, autobegin=True)
+ assert self._transaction is trans
return True
return False
@@ -1299,7 +1304,7 @@ class Session(_SessionClassMethods):
if self._transaction is not None:
if subtransactions or _subtrans or nested:
trans = self._transaction._begin(nested=nested)
- self._transaction = trans
+ assert self._transaction is trans
if nested:
self._nested_transaction = trans
else:
@@ -1307,7 +1312,8 @@ class Session(_SessionClassMethods):
"A transaction is already begun on this Session."
)
else:
- self._transaction = SessionTransaction(self, nested=nested)
+ trans = SessionTransaction(self, nested=nested)
+ assert self._transaction is trans
return self._transaction # needed for __enter__/__exit__ hook
def begin_nested(self):
diff --git a/lib/sqlalchemy/testing/fixtures.py b/lib/sqlalchemy/testing/fixtures.py
index 08cab051e..45ca48444 100644
--- a/lib/sqlalchemy/testing/fixtures.py
+++ b/lib/sqlalchemy/testing/fixtures.py
@@ -93,7 +93,7 @@ class TestBase(object):
from . import engines
def gen_testing_engine(
- url=None, options=None, future=False, asyncio=False
+ url=None, options=None, future=None, asyncio=False
):
if options is None:
options = {}