locked
Transações no Workflow RRS feed

  • Pergunta

  • Olá.

    Estou tentando usar transações no workflow através do componente Transaction Scope. Eu tenho um WF que chama outro WF, quando adicionei o Transaction Scope, recebi a seguinte mensagem de erro no componente invokeWorkflow: InvokeWorkflowActivity cannot be used inside TransactionScopeAcvity. Não é possível utilizar dessa forma? Como posso passar a transação de um WF para o outro? 

    Obrigado.

    Marcos Aguiar Jr - Brazil
    terça-feira, 25 de agosto de 2009 14:31

Respostas

  • Marcos boa tarde!

    Imagine o seguinte cenário - Você recebe uma nova compra e abre uma transação para inserir os dados e invoca o WF para gerar as parcelas, que consegue inserir e realizar o commit. Neste momento a execução volta para o WF de Compra que ao finalizar o processo executa um rollback no WF de Compra e no WF da Parcela. A pergunta que fica é : A sua solução consegue passar por este caso? Se sim a solução que você deu funciona perfeitamente, mas se a resposta for não, você está apenas abrindo duas transações independentes. Neste caso eu tentaria utilizar o WF de Parcelas dentro de um serviço WCF, sendo invocado dentro e um escopo de transação no WF de Compra.

    Abração!
    Cristiano Rodrigues
    • Marcado como Resposta Marcos Aguiar Jr terça-feira, 8 de setembro de 2009 19:53
    quinta-feira, 27 de agosto de 2009 17:09

Todas as Respostas

  • Marcos boa tarde!

    Segue o link para o site da Microsoft falando sobre o InvokeWorkflowActivity :http://msdn.microsoft.com/en-us/library/ms735829.aspx
    Neste site existe uma nota sobre a sua pergunta:

    "An InvokeWorkflowActivity cannot be contained in a TransactionScopeActivity or a CompensatableTransactionScopeActivity. This is because a transaction cannot flow from one workflow to another. If an attempt is made to contain an InvokeWorkflowActivity inside a TransactionScopeActivity or a CompensatableTransactionScopeActivity, a validation error occurs that contains the following message: Activity 'invokeWorkflowActivity1' validation failed: InvokeWorkflowActivity cannot be used inside TransactionScopeActivity. "

    Se você puder colocar o que deseja fazer, posso tentar montar uma solução para você.

    Abração!

    Cristiano Rodrigues
    quarta-feira, 26 de agosto de 2009 17:31
  • Olá Cristiano.

    Na verdade eu tenho WF que chama outro WF, o primeiro insere uma compra e o segundo insere o parcelamento dessa compra. Quero controlar a transação, ou seja, se der erro no WF de parcela o de compra deve executar o rollback. Estou usando o Entity Framework para fazer os insert, update e delete.

    Se puder ajudar.

    Obrigado.



    Marcos Aguiar Jr - Brazil
    quarta-feira, 26 de agosto de 2009 19:08
  • Marcos boa noite!

    Pelo que você descreveu a sua execução tem que ser síncrona, certo? Veja se é possível expor o seu WF de parcelamento dentro de um serviço WCF. Normalmente utilizamos o InvokeWorkflowActivity em processamentos assíncronos. Abaixo segue um link sobre como expor um WF em um serviço WCF.
    Os serviços WCF aceitam escopos de transação. Me mande um feedback.

    http://blog.newagesolution.net/2008/06/how-to-create-wf-as-wcf-service-hosted.html

    Abração!
    Cristiano Rodrigues
    quarta-feira, 26 de agosto de 2009 23:23
  • Olá Cristiano.

    Não se é o correto, mas utilizando um componente Code e colocando o seguinte código


    string

     

    result = "";

     

    wfParcela wfParcela = new wfParcela();

     

    AutoResetEvent waitHandle = new AutoResetEvent(false);

    wf.WorkflowCompleted +=

     

    delegate(object sender, WorkflowCompletedEventArgs e)

    {

    result = e.OutputParameters[

    "Message"].ToString();

    waitHandle.Set();

    };

     

    Dictionary<string, object> parameters = new Dictionary<string, object>();

    parameters.Add(

    "associado", associado);

    parameters.Add(

    "beginTransaction", true);

     

    WorkflowInstance instance = wf.CreateWorkflow(typeof(wfParcela), parameters);

    instance.Start();

    waitHandle.WaitOne();


    Assim ele conseguiu chamar o outro WF e eu só precisei parar a transação por parâmetro.

    O que você acha?

    Obrigado.


    Marcos Aguiar Jr - Brazil
    quinta-feira, 27 de agosto de 2009 11:49
  • Marcos boa tarde!

    Imagine o seguinte cenário - Você recebe uma nova compra e abre uma transação para inserir os dados e invoca o WF para gerar as parcelas, que consegue inserir e realizar o commit. Neste momento a execução volta para o WF de Compra que ao finalizar o processo executa um rollback no WF de Compra e no WF da Parcela. A pergunta que fica é : A sua solução consegue passar por este caso? Se sim a solução que você deu funciona perfeitamente, mas se a resposta for não, você está apenas abrindo duas transações independentes. Neste caso eu tentaria utilizar o WF de Parcelas dentro de um serviço WCF, sendo invocado dentro e um escopo de transação no WF de Compra.

    Abração!
    Cristiano Rodrigues
    • Marcado como Resposta Marcos Aguiar Jr terça-feira, 8 de setembro de 2009 19:53
    quinta-feira, 27 de agosto de 2009 17:09