2012-06-25 10 views
5

acabo de probar PetaPoco de transacciones de una manera multi-hilo ...Transacción PetaPoco en Multithread Env

Tengo un caso de prueba sencilla:

- valor del objeto simple llamarlo MediaDevice - Insertar una un registro actualizarlo a 1000 veces

void TransactionThread(Object object) 
{ 


    Database db = (Database) object; 

    for(int i= 0; i < 1000;i++) 
    { 


     Transaction transaction = db.GetTransaction(); 

     MediaDevice device = new MediaDevice(); 
     device.Name = "Name"; 
     device.Brand = "Brand"; 

     db.Insert(device); 

     device.Name = "Name_Updated"; 
     device.Brand = "Brand_Updated"; 


     db.Update(device); 

     transaction.Complete(); 

    } 


    long count = db.ExecuteScalar<long>("SELECT Count(*) FROM MediaDevices"); 

    Console.WriteLine("Number of all records:" + count); 

} 

Y esto lo llamo en dos hilos de la siguiente manera: [objeto de base de datos único para ambos hilos]

void TransactionTest() 
{ 

    Database db = GetDatabase(); 

    Thread tThread1 = ... // thread for TransactionTest() 

    Thread tThread2 = ... // thread for TransactionTest() 

    tThread1.Start(db); // pass Database to TransactionTest() 
    tThread2.Start(db); // pass same Database to TransactionTest() 

} 

me sale error nulo o, a veces objeto de error de base de datos dispuesta ..

Pero cuando el suministro de dos instancia de base de datos,

void TransactionTest() 
{ 

    Database db = GetDatabase(); 
    Database db2 = GetDatabase(); 

    Thread tThread1 = ... // thread for TransactionTest() 

    Thread tThread2 = ... // thread for TransactionTest() 


    tThread1.Start(db); // pass Database instance db to TransactionTest() 
    tThread2.Start(db2); // pass Database intance db2 to TransactionTest() 

} 

Todo es OK ...

Bien Cuando compruebo PetaPoco código fuente en la transacción veo que en transaction.Complete

public virtual void Complete() 
     { 
      _db.CompleteTransaction(); 
      _db = null; 
     } 

Mi pregunta es que para poder usar la transacción de varios hilos ¿Tengo que usar una nueva copia del objeto de la base de datos? ¿O qué estoy haciendo mal?

Y para que sea seguro para hilos, ¿tengo que abrir y cerrar NUEVA base de datos en cada consulta de actualización de datos?

Respuesta

1

Hola uso con nolock en la consulta de selección porque la tabla puede estar bloqueada. recuento largo = db.ExecuteScalar ("SELECT Count (*) con nolock FROM MediaDevices");

+0

No recibí excepciones en este estado ... db.ExecuteScalar (...) – Novalis

1

lo siento amigo ... sí, tienes razón. cambian el objeto para ser nulo. por lo que no puede usar el mismo objeto para enhebrar. tienes que usar el uso descrito como db = GetDataBase(); db2 = GetDataBase();

de lo contrario, puede cambiar el código fuente para su requisito. Creo que su licencia lo permite. pero no estoy seguro.

4

Sí, necesita una instancia de la base de datos PetaPoco por subproceso. Ver esta cita de la documentación PetaPoco:

Nota: para las transacciones a trabajar, todas las operaciones tienen que usar el mismo instancia del objeto de base de datos PetaPoco. Por lo tanto, probablemente desee utilizar una solicitud por http o contenedor IOC por subproceso para servir una instancia compartida de este objeto. Personalmente, StructureMap es mi favorito para esto.

He marcado la frase que da la clave. Se está diciendo que una instancia del objeto de base de datos PetaPoco se debe usar por subproceso.