diff options
| author | mike bayer <mike_mp@zzzcomputing.com> | 2021-01-16 01:14:54 +0000 |
|---|---|---|
| committer | Gerrit Code Review <gerrit@bbpush.zzzcomputing.com> | 2021-01-16 01:14:54 +0000 |
| commit | 3e40a232a025b770488c9d4940d284e3f7cdba24 (patch) | |
| tree | e0e27acfd811e3d05b6873e94a4a3d99a78c4352 /lib/sqlalchemy | |
| parent | f898ef162da65a3755d25ee194885677c880c91f (diff) | |
| parent | c5b4af959e13f8214121f62f322c668bb178d41f (diff) | |
| download | sqlalchemy-3e40a232a025b770488c9d4940d284e3f7cdba24.tar.gz | |
Merge "Guard against re-entrant autobegin in Core, ORM"
Diffstat (limited to 'lib/sqlalchemy')
| -rw-r--r-- | lib/sqlalchemy/engine/base.py | 3 | ||||
| -rw-r--r-- | lib/sqlalchemy/orm/session.py | 12 | ||||
| -rw-r--r-- | lib/sqlalchemy/testing/fixtures.py | 2 |
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 = {} |
