--- /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:
- self._do_autocommit(dbapi_connection, True)
+ if not before_autocommit:
+ self._do_autocommit(dbapi_connection, True)
cursor = dbapi_connection.cursor()
try:
cursor.execute(self._dialect_specific_select_one)
finally:
cursor.close()
- if not dbapi_connection.closed:
- self._do_autocommit(dbapi_connection, False)
+ if not before_autocommit and not dbapi_connection.closed:
+ self._do_autocommit(dbapi_connection, before_autocommit)
except self.dbapi.Error as err:
if self.is_disconnect(err, dbapi_connection, cursor):
return False
!= self._psycopg_TransactionStatus.IDLE
):
dbapi_conn.rollback()
- before = dbapi_conn.autocommit
+ before_autocommit = dbapi_conn.autocommit
try:
- self._do_autocommit(dbapi_conn, True)
+ if not before_autocommit:
+ self._do_autocommit(dbapi_conn, True)
dbapi_conn.execute(command)
finally:
- self._do_autocommit(dbapi_conn, before)
+ if not before_autocommit:
+ self._do_autocommit(dbapi_conn, before_autocommit)
def do_rollback_twophase(
self, connection, xid, is_prepared=True, recover=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={