2012-06-25 16 views
5

ho appena prova PetaPoco transazione in modo multithread ...PetaPoco transazione in multithread Env

Ho un semplice banco di prova:

- oggetto valore semplice chiamarlo MediaDevice - Inserire un un record aggiornarlo per 1000 volte

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); 

} 

E io chiamo questo in due thread come questo: [oggetto di database unico per entrambi i thread]

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() 

} 

ottengo l'errore nullo o, talvolta oggetto errore disposto per il database ..

Ma quando la fornitura di due istanza del database,

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() 

} 

Everthing è OK ...

Bene Quando controllo PetaPoco il codice sorgente a transazione vedo che a transaction.Complete

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

La mia domanda è quella di poter usare la transazione da più thread Devo usare una nuova copia dell'oggetto Database? O cosa sto sbagliando?

E per renderlo thread-thread devo aprire e chiudere NUOVO database ad ogni query di aggiornamento dei dati?

risposta

1

Ciao uso con nolock nella query di selezione perché la tabella potrebbe essere bloccata. long count = db.ExecuteScalar ("SELECT Count (*) con nolock FROM MediaDevices");

+0

Non ho ottenuto eccezioni a questo statementent ... db.ExecuteScalar (...) – Novalis

1

scusa amico .. sì hai ragione. cambiano l'oggetto per essere nullo. quindi non è possibile utilizzare lo stesso oggetto per il threading. devi usare che usano descritto come db = GetDataBase(); db2 = getDatabase();

altrimenti è possibile modificare il codice sorgente per le proprie esigenze. penso che la loro licenza lo permetta. ma non sono sicuro.

4

Sì, è necessaria un'istanza per-thread del database PetaPoco separata. Vedere questa citazione dalla documentazione PetaPoco:

Nota: per le transazioni al lavoro, tutte le operazioni hanno bisogno di utilizzare la stessa istanza dell'oggetto di database PetaPoco. Quindi probabilmente vorrai utilizzare per-http o il contenitore IOC per thread per per servire un'istanza condivisa di questo oggetto. Personally StructureMap è il mio preferito per questo .

Ho messo in evidenza la frase che dà l'indizio. Sta dicendo che un'istanza dell'oggetto del database PetaPoco dovrebbe essere usata per thread.