Транзакция PetaPoco в многопоточной среде

Я просто тестирую транзакцию PetaPoco в многопоточном режиме...

У меня есть простой тестовый пример:

--Простой объект значения назовите его MediaDevice --Вставьте запись и обновите ее 1000 раз

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

}

И я вызываю это в двух потоках следующим образом :[Один объект базы данных для обоих потоков]

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

}

Я получаю ошибку Null или иногда ошибку Object disposed for 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()

}

Все в порядке...

Что ж, когда я проверяю исходный код PetaPoco в транзакции, я вижу это в транзакции.Complete

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

Мой вопрос заключается в том, чтобы использовать транзакцию из нескольких потоков. Должен ли я использовать новую копию объекта базы данных? Или что я делаю не так?

И чтобы сделать его потокобезопасным, мне нужно открывать и закрывать НОВУЮ базу данных при каждом запросе обновления данных -?

6
задан Novalis 28 June 2012 в 08:44
поделиться

0 ответов

Другие вопросы по тегам:

Похожие вопросы: