2011-09-19 36 views
3

私はvb.netのWebアプリケーションを持っており、SQL接続とトランザクションをデータベースに1つのレコードを書き込むメソッドに渡しています。複数のトランザクションで1つのSQL接続を使用する

書き込まれた各レコードに対してトランザクションをコミットしますが、ループが完了するまで同じSQL接続を使用したいとします。私はusingステートメントを利用して見ましたが、それはme.itのために動作しませんでした

一つの方法は、最初の時間を実行し、トランザクションがすでにコミットされていることを第二のエラーを与える

Using sqlConnection = New SqlConnection(ConfigurationManager.ConnectionStrings("ConnectionString").ConnectionString) 
    sqlConnection.Open() 
    Using transaction = sqlConnection.BeginTransaction(IsolationLevel.ReadCommitted) 

     For Each user In users 
     Try 
      myDataWriteMethod(user, conn, tr) 

     Catch ex As Exception 
      tranaction.rollback() 
     End Try 
     transaction.commit() 
     Next 
    End Using 
End Using 
+0

、あなたの質問への答えのほかにいくつかのコード –

+0

を投稿できる、あなたは、エラー処理している正しく動作するつもりはありません - あなたはそれをコミットしようとし、その後、トランザクションをロールバック 'Try'ブロックを終了します同じ取引。個々のループの繰り返しを個別にコミットしたい場合は、 'Catch'ブロックの前の最後の文として' Try'ブロックの中でコミットを動かしてください。 –

答えて

1

forループの各ステップでトランザクションをコミットまたはロールバックしているかのように見えます。おそらく、例えば、(1)、例えば、ユーザごとに新しいトランザクションを開始

Using sqlConnection = New SqlConnection(ConfigurationManager.ConnectionStrings("ConnectionString").ConnectionString) 
    sqlConnection.Open() 
    For Each user In users 
     Using transaction = sqlConnection.BeginTransaction(IsolationLevel.ReadCommitted) 
     ... 

または(2)のみ最後にトランザクションをコミットまたはロールバックするか必要があります

Using sqlConnection = New SqlConnection(ConfigurationManager.ConnectionStrings("ConnectionString").ConnectionString) 
    sqlConnection.Open() 
    Using transaction = sqlConnection.BeginTransaction(IsolationLevel.ReadCommitted) 

     Try 
      For Each user In users 
       myDataWriteMethod(user, conn, tr) 
      Next 
     Catch ex As Exception 
      tranaction.rollback() 
     End Try 

     transaction.commit() 
    End Using 
End Using 

私は構文が間違っている可能性があるので、私はVB.NETプログラマではないことに注意してください。

+0

ありがとう... "SqlConnectionは並列トランザクションをサポートしていません"と同時に2人のユーザーが同時にアプリケーションを使用するなど、コードが2回実行されるとエラーが発生するのを助けることができますか? –

+0

@Adonis L:現在のトランザクションをコミットする前に、作成したSqlConnectionを再利用したり、新しいトランザクションを開こうとしていますか? – ig0774

+0

私はそう信じていませんが、1人のユーザーが実行するとうまく動作しますが、同時ユーザーがいるときに失敗すると、usingステートメントはユーザーごとに新しい接続を開く必要があります –

0

これは、必要な操作を行う必要があります。

Using sqlConnection = New SqlConnection(ConfigurationManager.ConnectionStrings("ConnectionString").ConnectionString) 
    sqlConnection.Open() 
    For Each user In users 
     Using transaction = sqlConnection.BeginTransaction(IsolationLevel.ReadCommitted) 
      Try 
       myDataWriteMethod(user, conn, tr) 
       transaction.Commit() 
      Catch ex As Exception 
       transaction.Rollback() 
      End Try 
     End Using 
    Next 
End Using 
関連する問題