0

я следующий метод:Null SqlCeTransaction в случайные моменты времени

public void SaveReferenceUpdates(ReferenceUpdatesDataContract updates) 
{ 
    mTransaction = Connection.BeginTransaction(); 
    try 
    { 
     // Do all the updates to get the database inline with the contract. 
     updates.UpdateFromContract(); 

     // Do all the deletes to get the database inline with the contract. 
     updates.DeletesFromContract(); 

     try{mTransaction.Commit();} 
     catch{throw;} 
     mTransaction = null; 
    } 
    catch (Exception e) 
    { 
     mTransaction.Rollback(); 
     mTransaction = null; 
     throw; 
    } 
} 

(. Я взял все мои заявления лесозаготовительных и разрушилась несколько способов, чтобы сделать это более удобным для чтения)

Странная вещь что иногда (очень очень случайным образом) mTransaction имеет значение null, когда он переходит к шагу фиксации. (Так как это происходит так случайным образом, я не смог узнать, является ли оно нулевым, когда оно получает транзакцию из соединения.)

Этот метод вызывается в двух местах. Один из них в то время, когда пользователь входит в мое приложение, а другой - когда пользователь неактивен на время (на основе таймера, который отключает ввод пользователя).

Я в тупике относительно того, что могло бы привести к тому, что могло бы быть SqlCeTransaction (mTransaction) когда-либо быть нулевым. (Справка ничего не говорит о возврате BeginTransaction null.)

ответ

1

Этот код вызван из нескольких потоков? Это объясняло бы поведение (поток 2 запускает транзакцию, только до того, как поток 1 закончит и установит его в null).

+0

Я думаю, что вы правы. Мне нужно найти способ убедиться, что только один поток будет писать на время. – Vaccano

+0

Возможно, вы можете передать транзакцию методам 'UpdateFromContract()' и 'DeleteFromContract()', тогда 'mTransaction' может быть локальным var. –

0

Это может быть правильно. Попробуйте заблокировать (mTransaction) весь блок. это может замедлить работу программы, но, безусловно, будет безопасным.

Смежные вопросы