2016-06-27 10 views
0

私は、次のコード...ADO.NETロックオブジェクト

private DbTransaction Transaction; 

    private readonly object TargetObject = new object(); 

    public CustomDataReader GetDataReader(CustomCommand command) 
    { 
     DbDataReader reader = null;   

     lock (TargetObject) // what is the purpose of this lock? 
     {         
      DbCommand cmd = ProviderFactory.CreateCommand(); 
      cmdConnection = Connection; 
      cmd.CommandText = command.Script; 
      cmd.Transaction = Transaction; 

      foreach (CommandParameter param in command.Parameters) 
      { 
       cmd.Parameters.Add(Parse(param)); 
      } 

      OpenConnection(); 

      if (Transaction == null) 
      {    
       reader = cmd.ExecuteReader(CommandBehavior.CloseConnection); 
      } 
      else 
      { 
       reader = cmd.ExecuteReader(); 
      } 
     } 

     return new CustomDataReader(reader); 
    } 

を持っている私はlock(TargetObject)の目的が何であるかを理解しようとしていますか?コマンドを実行するときにトランザクションを使用するとき、なぜそのロック機構を使用しますか?

+0

複数のC#スレッドが同時にコードを実行するのを防ぐためです。どうして?誰がコードを書いたかを尋ねる。 – Blorgbeard

+0

@Blorgbeard:男は建物を離れました。 – user2818430

答えて

1

マルチスレッド環境では、ロックセクション内のコードセクションは一度に1つのスレッドでしか実行できないことを意味します。これは、データベースとのすべての変更が一緒に失敗するか、成功することを意味するトランザクションとは異なります。

MSDNから:

ロックキーワードは、指定されたオブジェクトの相互排他ロックを取得する文を実行して、ロックを解除することにより、クリティカルセクションと文ブロックをマーク。

+0

私はこのメソッドをAsyncronousにしたいので、これを求めています。しかし、ロック内で私は待って実行することはできません知っている。長い話が短い:ロックを解除してメソッドを非同期にすると問題はありますか? – user2818430

+1

共有接続オブジェクトと共有トランザクションオブジェクト(共有接続を閉じる可能性があります)を使用しているので、現在のコードに問題がある可能性があります。接続を開いたり閉じたりしたり、同じトランザクションを使用したりすることなく、各インスタンスを実行できる場所にカプセル化しておく必要があります。 – Bryant