Usando sessões associadas

As sessões associadas facilitam a coordenação de ações em várias sessões no mesmo servidor. As sessões associadas permitem que duas ou mais sessões compartilhem a mesma transação e bloqueios e trabalhem nos mesmos dados sem conflitos de bloqueio. Essas seções podem ser criadas a partir de várias sessões dentro do mesmo aplicativo ou de vários aplicativos com sessões separadas.

Para participar de uma sessão associada, uma sessão chama o sp_getbindtoken ou o srv_getbindtoken (por meio do Open Data Services) para obter um token de ligação. Um token de ligação é uma cadeia de caracteres que identifica exclusivamente cada transação associada. O token de ligação é enviado às outras sessões a serem associadas à sessão atual. As outras sessões associam a transação chamando sp_bindsession, usando o token de ligação recebido da primeira sessão.

ObservaçãoObservação

Uma sessão deve ter uma transação de usuário ativa em ordem para que sp_getbindtoken ou srv_getbindtoken tenham êxito.

Os tokens de ligação devem ser transmitidos a partir do código do aplicativo que faz a primeira sessão para o código de aplicativo que associa subseqüentemente suas sessões à primeira sessão. Não há nenhuma instrução Transact-SQL ou função de API que um aplicativo pode usar para obter o token de ligação para uma transação iniciada por outro processo. Alguns dos métodos que podem ser usados para transmitir um token de ligação incluem o seguinte:

  • Se todas as sessões forem iniciadas do mesmo processo de aplicativo, os tokens de ligação poderão ser armazenados na memória global ou passados em funções como um parâmetro.

  • Se as sessões forem feitas a partir de processos de aplicativo separados, os tokens de ligação poderão ser transmitidos usando a comunicação entre processos (IPC), como uma chamada de procedimento remoto (RPC) ou troca dinâmica de dados (DDE).

  • Os tokens de ligação podem ser armazenados em uma tabela em uma instância do Mecanismo de banco de dados do SQL Server que possa ser lida pelos processos que desejam se associar à primeira sessão.

Somente uma sessão em um conjunto de sessões associadas pode estar ativa a qualquer momento. Se uma sessão estiver executando uma instrução na instância ou tiver resultados pendentes da instância, nenhuma outra sessão associada a ela poderá acessar a instância até que a sessão atual termine o processamento ou cancele a instrução atual. Se a instância estiver ocupada processando uma instrução de outras sessões associadas, ocorrerá um erro indicando que o espaço de transação está em uso e a sessão deverá tentar novamente posteriormente.

Quando você associa as sessões, cada sessão retém sua configuração de nível de isolamento. O uso de SET TRANSACTION ISOLATION LEVEL para alterar a configuração de nível de isolamento de uma sessão não afeta a configuração de nenhuma outra sessão associada a ela.

Tipos de sessões associadas

Os dois tipos de sessões associadas são local e distribuído.

  • Sessão associada local

    Permite que as sessões associadas compartilhem o espaço de transação de uma única transação em uma instância única do Mecanismo de Banco de Dados.

  • Sessão associada distribuída

    Permite que as sessões associadas compartilhem a mesma transação em duas ou mais instâncias até que toda a transação seja confirmada ou revertida usando o MS DTC (Coordenador de Transações Distribuídas da Microsoft).

As sessões associadas distribuídas não são identificadas por um token de ligação de cadeia de caracteres; elas são identificadas por meio de números de identificação da transação distribuída. Se uma sessão associada estiver envolvida em uma transação local e executar uma RPC em um servidor remoto com SET REMOTE_PROC_TRANSACTIONS ON, a transação associada local será promovida automaticamente a uma transação associada distribuída por MS DTC e uma sessão MS DTC será iniciada.

Quando usar sessões associadas

Nas versões anteriores do SQL Server, as sessões associadas eram usadas principalmente no desenvolvimento de procedimentos armazenados estendidos que precisavam executar instruções Transact-SQL a favor do processo que as chamava. A passagem do processo de chamada por um token de ligação como um parâmetro do procedimento armazenado estendido permite que o procedimento seja associado ao espaço de transação do processo de chamada, integrando o procedimento armazenado estendido ao processo de chamada.

No Mecanismo de banco de dados do SQL Server, os procedimentos armazenados gravados que usam CLR são mais seguros, evolutivos e estáveis que os procedimentos armazenados estendidos. Os procedimentos armazenados CLR usam o objeto SqlContext para unir o contexto da sessão de chamada, e não o sp_bindsession.

As sessões associadas podem ser usadas para desenvolver aplicativos de três camadas nos quais a lógica empresarial está incorporada em programas separados que trabalham cooperativamente em uma única transação empresarial. Esses programas devem ser codificados para coordenar seu acesso cuidadosamente a um banco de dados. Como as duas sessões compartilham os mesmos bloqueios, os dois programas não devem tentar modificar os mesmos dados ao mesmo tempo. Em qualquer point-in-time, apenas uma sessão pode trabalhar como parte da transação; não pode haver execução paralela. A transação pode ser alternada apenas entre sessões em pontos bem definidos, como quando todas as instruções DML forem concluídas e seus resultados forem recuperados.