我有代码
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
如果他进行了回滚并重新启动同步,那么下一次成功
答案 0 :(得分:0)
如果我已正确理解您的问题,SessaoAdm
和SessaoPdv
似乎会产生相同的NHibernate.ITransaction
。由于NHibernate不会启动嵌套事务,而是在会话的事务已经启动时只生成当前事务,所以第二个Rollback
只能失败,发现事务没有待处理。
检查SessaoAdm
和SessaoPdv
实际上是不同的ISession
个实例。也许你实现/初始化这些属性的方式会导致它们产生相同的实例。
在第一次rollbacck之前和之后检查两个事务的IsActive
值。