In the company I work for, we're using a NHibernate session wrapper that disposes all the sessions opened in the current web request at the end of the same request, and commits all the associated transactions (we're working in a multi-database environment, and we create a session for every database).
Also, in the session wrapper we're using, the session and the transactions are coupled, and we can't commit a transaction without disposing its session.
The problem is that, sometimes, a transaction stays open for all the request life, and database tables stays locked for much too time.
... are we missing something?