0

私は、次の方法があります。ヌル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になることがあります。 (これはランダムに起こるので、接続からトランザクションを取得するときにnullであるかどうかを確認できませんでした。)

このメソッドは2か所で呼び出されます。 1つは、ユーザーがmyアプリにログインしたときと、もう1つはユーザーが(ユーザーの入力から離れているタイマーに基づいて)一定時間非アクティブになったときです。

SqlCeTransactionmTransaction)がnullになる原因について私は困惑しています。 (ヘルプは、nullを返すBeginTransactionについて何も言わない)

答えて

1

このコードは複数のスレッドから呼び出されていますか?これは、スレッド1が終了してnullに設定される直前に、スレッド2がトランザクションを開始する動作を説明します。

+0

私はあなたが正しいと思います。私は、1つのスレッドだけが時間に書き込むことを確認する方法を見つける必要があります。 – Vaccano

+0

おそらくトランザクションを 'UpdateFromContract()'と 'DeleteFromContract()'メソッドに渡すことができます。それから、 'mTransaction'はローカルvarになります。 –

0

そうかもしれません。すべてのブロックをロック(mTransaction)してみてください。それはプログラムを遅くすることができますが、確かに安全です。