[service] split session retrieval and service execution
Internal session are not tracker by the repository and can not be retrieved
using _getsession. Moreover their session id is not unique…
Closes #2735700
[service] handle cnxset in the async case only
The service may be called by a session, we really do not want the call to
service to mess with the transaction state.
This does not apply to async were thread magic ensure a dedicated transaction.
[service] extract session retrieval from "task" closure
The session was retrieved there because `set_cnxset` must be called in the same
thread as the code using it. We now retrieve the session beforehand and
explicitly call `set_cnxset`.