Pergunta

Se eu criar um procedimento armazenado no SQL e chamá-lo (EXEC spStoredProcedure) dentro do / END BEGIN TRANSACTION, se este outro procedimento armazenado também cair na transação?

Eu não sabia se ele trabalhou como try / capturas em C #.

Foi útil?

Solução

Sim, tudo que você faz entre o Begin Transaction e Commit (ou reversão) é parte da transação.

Outras dicas

Parece ótimo, graças um bando. Acabei fazendo algo parecido com isso (porque eu estou no 05)

    BEGIN TRY
       BEGIN TRANSACTION

       DO SOMETHING

       COMMIT
    END TRY
    BEGIN CATCH
      IF @@TRANCOUNT > 0
         ROLLBACK

      -- Raise an error with the details of the exception
      DECLARE @ErrMsg nvarchar(4000), @ErrSeverity int
      SELECT @ErrMsg = ERROR_MESSAGE(),
             @ErrSeverity = ERROR_SEVERITY()

      RAISERROR(@ErrMsg, @ErrSeverity, 1)
    END CATCH

Eu acredito em MS SQL Server a execução do procedimento armazenado que aconteceria dentro da transação, mas ter muito cuidado com isso. Se você tiver transações aninhadas (ou seja, fora de transação do procedimento armazenado e uma transação diferente dentro do procedimento armazenado), um rollback irá afectar todas as transações, e não apenas a transação envolvente mais próxima.

Como Chris mencionado, você deve ser cuidadoso sobre rolando costas transação.

Especificamente o seguinte:

IF @@TRANCOUNT > 0 ROLLBACK

nem sempre é o que você quer. Você poderia fazer algo assim

IF(@@TRANCOUNT = 1) ROLLBACK TRAN
ELSE IF(@@TRANCOUNT > 1) COMMIT TRAN
RETURN @error

Desta forma, o proc chamando pode inspecionar o valor de retorno do procedimento armazenado e determinar se ele quer cometer qualquer maneira ou continuar a borbulhar o erro.

A razão é que 'COMMIT' só vai diminuir o seu contador de transação. Uma vez que diminui o contador de transações para zero, em seguida, um real cometer irá ocorrer.

Como Chris e James mencionado, você precisa ter cuidado ao lidar com transações aninhadas. Há um conjunto muito bons artigos sobre o assunto das transações escritos por Don Peterson em SQL Server Centra l, eu recomendaria ter uma leitura daqueles:

Aqui há:

Sim, todas as chamadas de procedimento armazenados aninhados estão incluídos no escopo da transação. Se você estiver usando SQL Server 2005 ou superior, você pode usar try ... catch bem. Aqui é mais detalhes sobre isso.

@ Chris, eu não sabia disso.

Quando pesquisando para mais informações, me deparei com este - você pode definir 'pontos de salvamento', que pode ser revertida para sem rolar para trás toda a transação.

Pode ser útil nesta situação.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top