事务的影响在for(nhibernate c#)中开始

时间:2016-02-24 23:45:20

标签: c# nhibernate

我有代码

vendasDoPdv.ForEach(vendaPdv =>
{

if (IgnoraNessaSincronizacao(vendaPdv))
return;

        var ecfCompativel = BuscaEcfCompativelDoAdm(emissoresDoAdm, vendaPdv);
        if (ecfCompativel == null)
            return;

        PessoaDt pessoaComaptivel = null;

        if (vendaPdv.ClienteDt != null)
            pessoaComaptivel = BuscaPessoaCompativel(vendaPdv);

        if (vendaPdv.ClienteDt != null && pessoaComaptivel == null)
            return;

        var transacaoAdm = SessaoAdm.BeginTransaction();
        var transacaoPdv = SessaoPdv.BeginTransaction();

        var vendaAdm = CriarVendaAdm(vendaPdv, pessoaComaptivel, ecfCompativel);

        try
        {
            PersitirVenda(vendaPdv, vendaAdm);
            EnviarItens(vendaPdv.VendaEcfItens, vendaAdm);
            EnviarPagamentos(vendaPdv.VendaEcfPagamentos, vendaAdm);

            transacaoAdm.Commit();
            transacaoPdv.Commit();
            RegistraEvento = true;
        }
        catch (Exception)
        {
            transacaoPdv.Rollback();
            transacaoAdm.Rollback();
            throw;
        }
    });

会发生什么 执行transacaoAdm.Rollback();他抛出异常

并且不运行回滚

例外

21/02/2016 09:44:33:Serviço iniciou uma sincronização
21/02/2016 09:44:33:Serviço concluiu com exito a sincronização
21/02/2016 09:45:34:Serviço iniciou uma sincronização
21/02/2016 09:45:34:Serviço concluiu com exito a sincronização
21/02/2016 09:46:35:Serviço iniciou uma sincronização
21/02/2016 09:55:12:Serviço falhou na sincronizacao
21/02/2016 09:55:12:Mensagem de erro: Transaction not successfully started
21/02/2016 09:55:13:StackTrace:    at 

FusionCore.PdvSincronizador.Sync.Sincronizador.SincronizarTudo() in C:\Users\Roberto\Documents\Projetos\Fusion\FusionCore\PdvSincronizador\Sync\Sincronizador.cs:line 79
   at FusionSincronizador.Core.ServicoSincronizadorMain.ExecutarSincronizacao() in C:\Users\Roberto\Documents\Projetos\Fusion\PdvSincronizador\Core\ServicoSincronizadorMain.cs:line 22
21/02/2016 09:55:13:--- Inner Exception ---
21/02/2016 09:55:13:Mensagem de erro:Transaction not successfully started
21/02/2016 09:55:13:StackTrace:    at FusionCore.PdvSincronizador.Sync.Sincronizador.RealizarSincronizacao(ISincronizacao sincronizacao) in C:\Users\Roberto\Documents\Projetos\Fusion\FusionCore\PdvSincronizador\Sync\Sincronizador.cs:line 31
   at FusionCore.PdvSincronizador.Sync.Sincronizador.SincronizarTudo() in C:\Users\Roberto\Documents\Projetos\Fusion\FusionCore\PdvSincronizador\Sync\Sincronizador.cs:line 68
21/02/2016 09:55:13:--- Inner Exception ---
21/02/2016 09:55:13:Mensagem de erro:Transaction not successfully started
21/02/2016 09:55:13:StackTrace:    at NHibernate.Transaction.AdoTransaction.CheckBegun()
   at NHibernate.Transaction.AdoTransaction.Rollback()
   at FusionCore.PdvSincronizador.Sync.Estrategia.EnviarVendasEcf.<>c__DisplayClass3_0.<Sincronizar>b__0(VendaEcfDt vendaPdv) in C:\Users\Roberto\Documents\Projetos\Fusion\FusionCore\PdvSincronizador\Sync\Estrategia\EnviarVendasEcf.cs:line 65
   at NHibernate.Util.EnumerableExtensions.ForEach[T](IEnumerable`1 query, Action`1 method)
   at FusionCore.PdvSincronizador.Sync.Estrategia.EnviarVendasEcf.Sincronizar(DateTime ultimaSincronizacao) in C:\Users\Roberto\Documents\Projetos\Fusion\FusionCore\PdvSincronizador\Sync\Estrategia\EnviarVendasEcf.cs:line 30
   at FusionCore.PdvSincronizador.Sync.Sincronizador.RealizarSincronizacao(ISincronizacao sincronizacao) in C:\Users\Roberto\Documents\Projetos\Fusion\FusionCore\PdvSincronizador\Sync\Sincronizador.cs:line 25
21/02/2016 09:56:14:Serviço iniciou uma sincronização

如果他进行了回滚并重新启动同步,那么下一次成功

1 个答案:

答案 0 :(得分:0)

如果我已正确理解您的问题,SessaoAdmSessaoPdv似乎会产生相同的NHibernate.ITransaction。由于NHibernate不会启动嵌套事务,而是在会话的事务已经启动时只生成当前事务,所以第二个Rollback只能失败,发现事务没有待处理。

检查SessaoAdmSessaoPdv实际上是不同的ISession个实例。也许你实现/初始化这些属性的方式会导致它们产生相同的实例。

在第一次rollbacck之前和之后检查两个事务的IsActive值。