built-in pooling does not reset session state for isolation level
Describe the bug
setting the transaction isolation level on a connection carries over into new connections due to implicit connection pooling which seems to lack a means of establishing reset behaviors
To reproduce
import mssql_python MSSQLPYTHON = ( "Server=mssql2022,1433;Database=test;UID=scott;PWD=tiger^5HHH;Encrypt=No" ) def get_isolation_level(dbapi_connection): cursor = dbapi_connection.cursor() view_name = "sys.system_views" cursor.execute( ( "SELECT name FROM {} WHERE name IN " "('dm_exec_sessions', 'dm_pdw_nodes_exec_sessions')" ).format(view_name) ) row = cursor.fetchone() view_name = f"sys.{row[0]}" cursor.execute( """ SELECT CASE transaction_isolation_level WHEN 0 THEN NULL WHEN 1 THEN 'READ UNCOMMITTED' WHEN 2 THEN 'READ COMMITTED' WHEN 3 THEN 'REPEATABLE READ' WHEN 4 THEN 'SERIALIZABLE' WHEN 5 THEN 'SNAPSHOT' END AS TRANSACTION_ISOLATION_LEVEL FROM {} where session_id = @@SPID """.format( view_name ) ) row = cursor.fetchone() cursor.close() return row[0].upper() connection = mssql_python.connect(MSSQLPYTHON) print( f"New connection {connection}: " f"isolation level: {get_isolation_level(connection)}" ) cursor = connection.cursor() cursor.execute(f"SET TRANSACTION ISOLATION LEVEL SERIALIZABLE") cursor.close() print( f"Changed isolation level for {connection}: " f"now it's: {get_isolation_level(connection)}" ) connection.close() connection = mssql_python.connect(MSSQLPYTHON) print( f"Made another new connection {connection}: " f"isolation level: {get_isolation_level(connection)}" ) connection.close() mssql_python.pooling(enabled=False) connection = mssql_python.connect(MSSQLPYTHON) print( f"Disabled pooling and connected again: {connection}: " f"isolation level: {get_isolation_level(connection)}" )
this outputs:
New connection <mssql_python.connection.Connection object at 0x7f2e7eb397f0>: isolation level: READ COMMITTED
Changed isolation level for <mssql_python.connection.Connection object at 0x7f2e7eb397f0>: now it's: SERIALIZABLE
Made another new connection <mssql_python.connection.Connection object at 0x7f2e7eb9d950>: isolation level: SERIALIZABLE
Disabled pooling and connected again: <mssql_python.connection.Connection object at 0x7f2e7eb9da90>: isolation level: READ COMMITTED
it is supposed to output:
New connection <mssql_python.connection.Connection object at 0x7f2e7eb397f0>: isolation level: READ COMMITTED
Changed isolation level for <mssql_python.connection.Connection object at 0x7f2e7eb397f0>: now it's: SERIALIZABLE
Made another new connection <mssql_python.connection.Connection object at 0x7f2e7eb9d950>: isolation level: READ COMMITTED
Disabled pooling and connected again: <mssql_python.connection.Connection object at 0x7f2e7eb9da90>: isolation level: READ COMMITTED
for connection pooling to work, everything on that session has to be reset between connections, or at least there needs to be a way to customize this. as an example look at PG bouncer server_reset_query.