1

我正在編寫一個串行事務並且遇到了一些麻煩。
如果我只執行一個線程,它會執行速度快,無需等待。
如果我執行兩個或多個線程,完成的第一個線程花費太多時間,但後續線程很快,爲什麼?實體框架串行事務需要太多時間才能完成

如果我同時運行這個程序的兩個進程,每個進程的第一個線程需要花費太多的時間來完成,但後來很快,這是正常的嗎?

我正在使用sql express 2008

謝謝。

class Program { 

    int numero; 

    Program(int numero) 
    { 
     this.numero = numero; 
    } 

    static void Main(string[] args) 
    { 
     Console.WriteLine("Puede presionar una tecla para salir en cualquier momento"); 

     for (int i = 0; i < 10; i++) 
     { 
      Program p = new Program(i + 1); 
      Thread t = new Thread(p.Ejecutar); 
      t.Start(); 
     } 

     Console.ReadKey(); 
    } 

    public void Ejecutar() 
    { 
     bool esPosibleProseguir = true; 
     while (esPosibleProseguir) 
     { 
      Database1Entities cx = new Database1Entities(); 
      TransactionOptions opts = new TransactionOptions(); 
      opts.IsolationLevel = System.Transactions.IsolationLevel.Serializable; 
      System.Transactions.TransactionScope scope = new System.Transactions.TransactionScope(TransactionScopeOption.Required, opts); 

      try 
      { 
       //var mayor = cx.Numeracion.First(); 
       //int nuevo = mayor.Numero + 1; 
       cx.Connection.Open(); 

       int nuevo = cx.VistaNumero.First().Actual; 

       var per = new Persona(); 
       per.Nombre = string.Format("Persona-{0}", nuevo); 
       per.Ci = (1000 + nuevo).ToString(); 
       per.Numero = nuevo; 
       cx.Persona.AddObject(per); 

       //mayor.Numero = nuevo; 

       cx.SaveChanges(); 
       scope.Complete(); 


       Console.WriteLine("Hilo: {0}, Crea persona: {1}", this.numero, nuevo); 
       break; 
      } 
      catch (UpdateException ex1) 
      { 
       esPosibleProseguir = true; 
      } 
      catch (TransactionAbortedException ex2) 
      { 
       esPosibleProseguir = true; 
      } 
      catch (Exception ex) 
      { 
       Console.WriteLine("Hilo: {0}, Excepción: {1}, Mensaje: {2}", this.numero, ex.GetType().Name, ex.Message); 
       esPosibleProseguir = false; 
      } 
      finally 
      { 
       DisponerObjeto(scope); 
       DisponerObjeto(cx); 
      } 
     } 
    } 

    private void DisponerObjeto(IDisposable obj) 
    { 
     try 
     { 
      obj.Dispose(); 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine("Hilo: {0}, Excepción: {1}, Mensaje: {2}", this.numero, ex.GetType().Name, ex.Message); 
     } 
    } 
} 

回答

0

這可能是因爲EF相關的代碼第一次執行會導致「模型彙編」加上其他一些初始化這是相當耗時的操作,直到此編譯完成沒有其他人可以使用EF。這只是一個猜測,但您可以嘗試使用percompiled model來驗證執行時間是否會改善。

+0

如果我將隔離級別從serializable更改爲read-commited,問題消失,因此「model compilation」不是原因,但我需要串行事務,並且第一個線程需要花費太多時間才能完成。這是正常的嗎?感謝您的答覆。 – david

相關問題