1
私はシリアルトランザクションを作成していて、いくつかの問題がありました。
1つのスレッドのみを実行すると、高速で実行され、待機しません。
2つ以上のスレッドを実行すると、完了する最初のスレッドは時間がかかりますが、後続のスレッドは高速です。なぜですか?エンティティフレームワークのシリアルトランザクションの完了に時間がかかります
このプログラムと同時に2つのプロセスを実行すると、各プロセスの最初のスレッドが完了するのに時間がかかりますが、それ以降は高速ですが、これは正常ですか?
私は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);
}
}
}
アイソレーションレベルをシリアライズ可能から読み取りコミット済みに変更すると問題がなくなり、 "モデルコンパイル"は原因ではありませんが、シリアルトランザクションが必要で、最初のスレッドが完了するのに時間がかかりすぎます。これは正常ですか?お返事をありがとうございます。 – david