Fixed an issue what would cause autocommit mode to be reset
when using pre_ping in conjunction engine level autocommit
on the psycopg2 driver.
Fixes: #7930
Change-Id: I4cccaf1b7f8cbacd853689458080784114fcc390
(cherry picked from commit
363b68e08e9ceed4ce6821f5fd48ab32bdfd807c)
--- /dev/null
+.. change::
+ :tags: bug, postgresql
+ :tickets: 7930
+
+ Fixed an issue what would cause autocommit mode to be reset
+ when using pre_ping in conjunction engine level autocommit
+ on the psycopg2 driver.
def do_ping(self, dbapi_connection):
cursor = None
+ before_autocommit = dbapi_connection.autocommit
try:
- dbapi_connection.autocommit = True
+ if not before_autocommit:
+ dbapi_connection.autocommit = True
cursor = dbapi_connection.cursor()
try:
cursor.execute(self._dialect_specific_select_one)
finally:
cursor.close()
- if not dbapi_connection.closed:
- dbapi_connection.autocommit = False
+ if not before_autocommit and not dbapi_connection.closed:
+ dbapi_connection.autocommit = before_autocommit
except self.dbapi.Error as err:
if self.is_disconnect(err, dbapi_connection, cursor):
return False
dbapi_conn.rollback()
eq_(val, "off")
+ @testing.combinations((True,), (False,), argnames="autocommit")
+ def test_autocommit_pre_ping(self, testing_engine, autocommit):
+ engine = testing_engine(
+ options={
+ "isolation_level": "AUTOCOMMIT"
+ if autocommit
+ else "SERIALIZABLE",
+ "pool_pre_ping": True,
+ }
+ )
+ for i in range(4):
+ with engine.connect() as conn:
+ conn.execute(text("select 1")).scalar()
+
+ dbapi_conn = conn.connection.dbapi_connection
+ eq_(dbapi_conn.autocommit, autocommit)
+
def test_deferrable_flag_engine(self):
engine = engines.testing_engine(
options={