【问题标题】:Entity framework serial transaction takes too much time to complete实体框架串行事务需要太多时间才能完成
【发布时间】:2012-02-18 03:55:52
【问题描述】:

我正在编写一个串行事务并且遇到了一些麻烦。
如果我只执行一个线程,它执行速度很快,无需等待。
如果我执行两个或多个线程,完成的第一个线程需要太多时间,但后续线程很快,为什么?

如果我同时运行这个程序的两个进程,每个进程的第一个线程需要太多时间才能完成,但随后的速度很快,这是正常的吗?

我正在使用 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);
        }
    }
}

【问题讨论】:

    标签: sql-server-2008 entity-framework transactionscope isolation-level


    【解决方案1】:

    这可能是因为第一次执行 EF 相关代码会导致“模型编译”加上其他一些非常耗时的初始化操作,并且在此编译完成之前没有其他人可以使用 EF。这只是一个猜测,但您可以尝试使用percompiled model 来验证执行时间是否会有所改善。

    【讨论】:

    • 如果我将隔离级别从可序列化更改为已提交读,问题就会消失,因此“模型编译”不是原因,但我需要串行事务并且第一个线程需要太多时间才能完成。这是正常的吗?感谢您的回复。
    猜你喜欢
    • 1970-01-01
    • 2012-03-19
    • 2015-04-17
    • 2022-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多