Você está offline; aguardando reconexão

Como implementar transações aninhadas com o ADO e o SQL Server

IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.

Clique aqui para ver a versão em Inglês deste artigo: 238163
Aviso de Isenção de Responsabilidade sobre Conteúdo do KB Aposentado
Este artigo trata de produtos para os quais a Microsoft não mais oferece suporte. Por esta razão, este artigo é oferecido "como está" e não será mais atualizado.
Sumário
ADO, com os provedores de SQLOLEDB e MSDASQL, não oferece suporte a transações aninhadas com o SQL Server. No entanto, comandos nativos do T-SQL ainda podem ser usados com o ADO para implementar transações aninhadas no SQL Server.

Isso pode ser feito de duas maneiras diferentes:

Modelo-1: Sem usando Salvar pontos

-Iniciar OuterTrans
-Iniciar InnerTrans1
-Iniciar InnerTrans2
-Iniciar InnerTrans3

análise :
Confirmar OuterTrans confirma todas as transações aninhadas. Revertendo OuterTrans reverte todas as transações aninhadas.

Modelo-2: Usar pontos de salvamento:

-Iniciar OuterTrans
-Salvar InnerTrans1
-Salvar InnerTrans2
-Salvar InnerTrans3

análise:
Confirmar OuterTrans confirma todas as transações aninhadas. Revertendo qualquer ponto de transação interno salvo reverte todas as transações aninhadas abaixo desse ponto. Pontos salvos podem ser usados para reverter transações aninhadas em um determinado ponto sem afetar as transações aninhadas em diferentes salvo pontos.
Mais Informações
A seguir está um aplicativo de ADO do Visual Basic de exemplo que vai contra o SQL Server. Ele usa a tabela "armazenamentos" no banco de dados pubs.
  1. Crie um novo projeto EXE Visual Basic padrão. O Form1 é criado por padrão. Adicione dois botões de comando no Form1 da seguinte maneira:
    Command1.Caption: Usar transações aninhadas
    Command1.Name: NestedTrans

    Command2.Caption: Usar Salvar pontos
    Command2.Name: Ponto de salvamento
  2. Adicionar uma referência para o Microsoft ActiveX Data Objects Library.
  3. Cole as seguintes linhas na janela código do Form1:

    Observação Você deve alterar usuário ID = < ID de Usuário > para o valor correto antes de executar esse código. Certifique-se que a ID de usuário tenha as permissões apropriadas para executar esta operação no banco de dados.
    Option ExplicitDim Cn As New ADODB.ConnectionDim Cmd As New ADODB.CommandDim rst As New ADODB.RecordsetPrivate Sub SavePoint_Click()   With rst    .ActiveConnection = Cn    .CursorType = adOpenStatic    .Source = "select * from stores where stor_id LIKE '10%'"    .Open  End With   Cn.Execute "Delete from stores where stor_id LIKE  '10%'"  ' OuterTrans  Cn.Execute "BEGIN TRANSACTION OuterMost"  Cn.Execute "Insert INTO Stores (stor_id, stor_name) " & _             "VALUES(101,'1st Store')"  Cn.Execute "Insert INTO Stores (stor_id, stor_name) " & _             "VALUES(102,'2nd Store')"    ' InnerTrans1 Transaction  Cn.Execute "SAVE TRANSACTION InnerTrans1"   Cn.Execute "Insert INTO Stores (stor_id, stor_name) " & _             "VALUES(103,'3rd Store')"  Cn.Execute "Insert INTO Stores (stor_id, stor_name) " & _             "VALUES(104,'4th Store')"    ' InnerTrans2 Transaction  Cn.Execute "SAVE TRANSACTION InnerTrans2"     Cn.Execute "Insert INTO Stores (stor_id, stor_name) " & _             "VALUES(105,'5th Store')"  Cn.Execute "Insert INTO Stores (stor_id, stor_name) " & _             "VALUES(106,'6th Store')"     ' InnerTrans3 Transaction  Cn.Execute "SAVE TRANSACTION InnerTrans3"    Cn.Execute "Insert INTO Stores (stor_id, stor_name) " & _             "VALUES(107,'7th Store')"  Cn.Execute "Insert INTO Stores (stor_id, stor_name) " & _             "VALUES(108,'8th Store')"     Cn.Execute "ROLLBACK TRANSACTION InnerTrans2"  Cn.Execute "COMMIT TRANSACTION OuterMost"    rst.Requery   While Not rst.EOF    Debug.Print rst(0), rst(1)    rst.MoveNext  Wend    rst.CloseEnd SubPrivate Sub NestedTrans_Click()   With rst    .ActiveConnection = Cn    .CursorType = adOpenStatic    .Source = "select * from stores where stor_id LIKE '10%'"    .Open  End With   Cn.Execute "Delete from stores where stor_id LIKE  '10%'"    ' OuterTrans  Cn.Execute "BEGIN TRANSACTION OuterMost"  Cn.Execute "Insert INTO Stores (stor_id, stor_name) " & _             "VALUES(101,'1st Store')"  Cn.Execute "Insert INTO Stores (stor_id, stor_name) " & _             "VALUES(102,'2nd Store')"    ' InnerTrans1 Transaction   Cn.Execute "BEGIN TRANSACTION InnerTrans1"   Cn.Execute "Insert INTO Stores (stor_id, stor_name) " & _             "VALUES(103,'3rd Store')"  Cn.Execute "Insert INTO Stores (stor_id, stor_name) " & _             "VALUES(104,'4th Store')"    ' InnerTrans2 Transaction  Cn.Execute "BEGIN TRANSACTION InnerTrans2"    Cn.Execute "Insert INTO Stores (stor_id, stor_name) " & _             "VALUES(105,'5th Store')"  Cn.Execute "Insert INTO Stores (stor_id, stor_name) " & _             "VALUES(106,'6th Store')"     ' InnerTrans3 Transaction  Cn.Execute "BEGIN TRANSACTION InnerTrans3"    Cn.Execute "Insert INTO Stores (stor_id, stor_name) " & _             "VALUES(107,'7th Store')"  Cn.Execute "Insert INTO Stores (stor_id, stor_name) " & _             "VALUES(108,'8th Store')"     ' Uncomment the following line to roll back the OuterTrans that rolls  ' all nested transactions.   ' Cn.Execute "ROLLBACK TRANSACTION OuterMost"  ' The following commits all nested transactions.  Cn.Execute "COMMIT TRANSACTION OuterMost"    rst.Requery   While Not rst.EOF    Debug.Print rst(0), rst(1)    rst.MoveNext  Wend    rst.CloseEnd SubPrivate Sub Form_Load()   Cn.Open "Provider=SQLOLEDB;User ID=<User ID>;Data " & _           "Source=<insert your SQL Server>;database=pubs"  Cn.CursorLocation = adUseClientEnd Sub					
  4. Altere a seqüência de conexão no método Form_Load adequadamente para se conectar ao seu SQL Server.
  5. Execute o projeto e clique no comando NestedTrans . Isso confirma todas as transações aninhadas.
  6. Clique em ponto de salvamento . Isso traz de volta InnerTrans2 e InnerTrans3, produzindo os seguintes resultados:
    101 armazenamento de 1 º
    102 armazenamento 2ª
    103 armazenamento 3 º
    104 armazenamento de 4 º
Referências
Para obter informações adicionais, clique nos números abaixo para ler os artigos na Base de dados de Conhecimento da Microsoft:
177138INFO: Aninhadas transações não está disponíveis no ODBC/OLE DB/ADO
198024INFO: Noções básicas sobre ADO transações com o Microsoft SQL Server
Manuais do SQL Server na linha, de documentação.

Aviso: este artigo foi traduzido automaticamente

Propriedades

ID do Artigo: 238163 - Última Revisão: 07/01/2004 16:28:18 - Revisão: 2.1

Microsoft ActiveX Data Objects 2.0, Microsoft ActiveX Data Objects 2.01, Microsoft ActiveX Data Objects 2.1, Microsoft ActiveX Data Objects 2.1 Service Pack 1, Microsoft ActiveX Data Objects 2.1 Service Pack 2, Microsoft ActiveX Data Objects 2.5, Microsoft ActiveX Data Objects 2.6, Microsoft ActiveX Data Objects 2.7

  • kbmt kbdatabase kbhowto KB238163 KbMtpt
Comentários
sByTagName("head")[0].appendChild(m);