none
Funcionalidade Begin Transaction RRS feed

  • Pergunta

  • Olá a todos,

    Estou criando uma procedure para salvar as compras realizadas pelo usuário. Tenho duas tabelas que vão armazenar os dados sobre a compra, uma é a tblCompras onde eu salvo o número da compra e a data em que foi realizada, e a tabela tblComprasDetalhe, que mantém os produtos pertencente aquela compra. Basicamente é um sistema super simples, porém como vou ter muitos usuários conectados ao mesmo tempo eu não sei como salvar os dados na tabela tblCompras e tblComprasDetalhe.

    Eu inicialmente pensei em salvar primero na tblCompras e executar um select para retornar o número da última compra para ligar com a tabela de tblcomprasdetalhe, porém se muitos usuário estiverem utilizando o sistema, esse esquema vai furar pois eu posso salvar os detalhes de uma compra no pedido de outra. Comecei a pesquisar e encontrei algo sobre o BEGIN TRANSACTION, onde eu conseguiria salvar na tabela de compras e logo em seguida na de comprasdetalhe, e se caso algo ocorra, acontece um ROLLBACK. Porém como eu sou iniciante eu não sei como fazer isso no sql server 2000. Alguém teria alguma dica ou algum link para saber como solucionar o problema de salvar em uma tabela e utilizar esse registro recem salvo para salvar em outra tabela também??

     

    Muito obrigado pela atenção de todos!

    sexta-feira, 12 de janeiro de 2007 16:50

Respostas

  • Fábio,

    Você poderia trabalhar com um bloco Begin Transaction ou se fosse o caso utilizar um Trigger.

    O que você poderia fazer é dentro deste bloco Begin Transaction é trabalhar com a variável de sistema @@Error, esta variável tem como objetivo receber um valor numérico caso acontece algum problema durante a execução do bloco Begin Transaction.

    Exemplo utilizando a variável @@ERROR.

    UPDATE HumanResources.Employee
        SET PayFrequency = 4
        WHERE NationalIDNumber = 615389812;
    IF @@ERROR = 547
        PRINT N'A check constraint violation occurred.';

    Outro exemplo, utilizando o bloco Begin Transaction:

    DECLARE @TranName VARCHAR(20);
    SELECT @TranName = 'MyTransaction';

    BEGIN TRANSACTION @TranName;
    USE AdventureWorks;
    DELETE FROM AdventureWorks.HumanResources.JobCandidate
        WHERE JobCandidateID = 13;

    COMMIT TRANSACTION @TranName;

    sexta-feira, 12 de janeiro de 2007 17:04

Todas as Respostas

  • Fábio,

    Você poderia trabalhar com um bloco Begin Transaction ou se fosse o caso utilizar um Trigger.

    O que você poderia fazer é dentro deste bloco Begin Transaction é trabalhar com a variável de sistema @@Error, esta variável tem como objetivo receber um valor numérico caso acontece algum problema durante a execução do bloco Begin Transaction.

    Exemplo utilizando a variável @@ERROR.

    UPDATE HumanResources.Employee
        SET PayFrequency = 4
        WHERE NationalIDNumber = 615389812;
    IF @@ERROR = 547
        PRINT N'A check constraint violation occurred.';

    Outro exemplo, utilizando o bloco Begin Transaction:

    DECLARE @TranName VARCHAR(20);
    SELECT @TranName = 'MyTransaction';

    BEGIN TRANSACTION @TranName;
    USE AdventureWorks;
    DELETE FROM AdventureWorks.HumanResources.JobCandidate
        WHERE JobCandidateID = 13;

    COMMIT TRANSACTION @TranName;

    sexta-feira, 12 de janeiro de 2007 17:04
  • Entendi Junior, muito obrigado pela ajuda!!

     

    Só mais uma dúvida é, eu preciso salvar dados na tabela de compras, e logo em seguida pegar o codigo da compras (campo chave, tipo int com identity) para salvar na tabela de comprasdetalhe(que tem o campo intCompra). Como eu posso fazer isso garantindo a integridade dos dados?  eu pensei em utilizar o begin trans pra criar uma especie de bloco, onde se outro usuário efetuar uma compra ao mesmo tempo, minha stored procedure nao irá se confundir e salvar o ID da compra na tabela comprasdetalhe corretamente.

    Existe outro método, ou boa pratica pra seguir neste meu caso??

     

    Muito Obrigado novamente pela atenção Junior.

    sexta-feira, 12 de janeiro de 2007 17:18
  • Fábio,

    Você poderia continuar há utilizar um bloco Begin Trans, mas isso dentro de um trigger, o trigger é um gatilho executado automaticamente quando uma determinada operação por exemplo: Insert, Update, Delete.

    Neste trigger você poderá pegar o quando ID da sua table compra e salvar na table comprasdetalhe, quando se utiliza trigger o SQL Server, vai trabalhar com tables Inserted, Deleted, é justamente nestes tables que você vai obter os valores referentes aos registros que estão sendo manipulados na sua table.

    Uma observação, é que o trigger é baseado em transações, ou seja, cada operação realizada na table ao qual o trigger esta associado ele será executado.

    sexta-feira, 12 de janeiro de 2007 17:27
  • Perfeito Junior, muito obrigado novamente por sua colaboração.

    Vou procurar mais sobre estas tabelas Inserted, Deleted e Updated.

     

    Vc indica algum site onde eu me informo mais sobre este assunto?

     

    Obrigado e boa tarde!!

    sexta-feira, 12 de janeiro de 2007 17:33
  •  Fábio Moggi wrote:

    Perfeito Junior, muito obrigado novamente por sua colaboração.

    Vou procurar mais sobre estas tabelas Inserted, Deleted e Updated.

    Vc indica algum site onde eu me informo mais sobre este assunto?

    Obrigado e boa tarde!!



    acesse: http://www.devmedia.com.br/articles/viewcomp.asp?comp=5625

    sexta-feira, 20 de julho de 2007 00:52