In AOLserver there is a convenient proc 
ns_atclose
which might be used to do what you want. Here is an example of it being used with namespace vars:
namespace eval ::twt::db::transaction {
    variable initialized 0
    variable ids
 
    namespace import ::twt::log::*
}
proc ::twt::db::transaction::init { } {
    ns_atclose ::twt::db::transaction::reset
    
    variable initialized 1
    variable ids
    array unset ids
}
proc ::twt::db::transaction::reset { } {
    # This runs after the connection closes
    variable initialized
    variable ids
    # Need to rollback any open transactions
    foreach id [array names ids] {
	
	set transactionInfo $ids($id)
	set provider [lindex $transactionInfo 0]
	set transactionRollbackProc [set ::twt::db::${provider}::transactionRollbackProc]
	$transactionRollbackProc $id
    }
    
    array unset ids
    set initialized 0
}
The namespace vars are reset for each connection. Ns_atclose is guaranteed to run even if the connection returns an error, it also runs at the end of a scheduled procedure, if the code were to be used there.