views:

3427

answers:

2

sp_reset_connection seems to be called by SQL Server connection pooling, to ensure that connections reused from the pool have most of their settings reset. Does anyone know exactly what it does and doesn't do though?

eg I see from this post that it doesn't reset the transaction isolation level

+10  A: 

http://www.sqldev.net/misc/sp_reset_connection.htm

The text is white on my browser (firefox) ... just highlight it with your mouse and you can see the details...

Just placing it here since its hard to read on that site

Data access API's layers like ODBC, OLE-DB and SqlClient call the (internal) stored procedure sp_reset_connection when re-using a connection from a connection pool. It does this to reset the state of the connection before it gets re-used, however nowhere is documented what things get reset. This article tries to document the parts of the connection that get reset.

sp_reset_connection resets the following aspects of a connection:

  • It resets all error states and numbers (like @@error)
  • It stops all EC's (execution contexts) that are child threads of a parent EC executing a parallel query
  • It will wait for any outstanding I/O operations that is outstanding
  • It will free any held buffers on the server by the connection
  • It will unlock any buffer resources that are used by the connection
  • It will release all memory allocated owned by the connection
  • It will clear any work or temporary tables that are created by the connection
  • It will kill all global cursors owned by the connection
  • It will close any open SQL-XML handles that are open
  • It will delete any open SQL-XML related work tables
  • It will close all system tables
  • It will close all user tables
  • It will drop all temporary objects
  • It will abort open transactions
  • It will defect from a distributed transaction when enlisted
  • It will decrement the reference count for users in current database; which release shared database lock
  • It will free acquired locks
  • It will releases any handles that may have been acquired
  • It will reset all SET options to the default values
  • It will reset the @@rowcount value
  • It will reset the @@identity value
  • It will reset any session level trace options using dbcc traceon()

sp_reset_connection will NOT reset:

  • Security context, which is why connection pooling matches connections based on the exact connection string
  • If you entered an application role using sp_setapprole, since application roles can not be reverted
Chris Klepeis
See linked article and connect page - it will also NOT reset any SET TRANSACTION ISOLATION LEVEL
Rory
Also, thanks - i didn't notice the white text on that page!
Rory
A: 

From this forum post:

The sp_reset_connection stored procedure is used to reset a connection so that when it is used in a pool, nothing from a previous session is stored that is connection-specific.

Mark Struzinski
Unfortunately it's not correct that "nothing" is preserved. The isolation level is preserved, and that can cause a problem down the line. In our case something ran with a serializable level (intentionally), but then released the connection to the pool, subsequent users then also ran with serializable instead of read-commited.
WaldenL