2011-08-09 8 views
0

こんにちはすべて私は、3.5フレームワークで書かれた.net Webサービスからの同時ストアドプロシージャ呼び出しに関する質問があります。.net Webサービスで重複した応答をもたらす並行トランザクション呼び出し

多くのユーザーが使用し、Oracleデータベースから連絡先情報を返す必要があるWebサービスを構築しています。 問題は、dbが同じ連絡先情報を返すと同時に2人以上のユーザーがクリックした場合です。 SPに状態更新クエリを書きました。ステータスの更新が行われる前に、2つ以上の要求が同じレコードを読み取った場合にのみ、この問題が発生しています。私はトランザクションとトランザクションスコープを使用しましたが、問題は解決しません。私が問題に正しく取り組んでいるかどうか、私は別の方法で見ているべきかどうか誰にでも教えてもらえますか?どんな助けでも大歓迎です。

+0

別のトランザクションによって変更されているかどうかを確認せず、その後IDに基づいてUPDATEをSELECTをやっているUmmmm、我々は14分を持っている

UPDATE table SET status = 'READ' WHERE ... RETURNING col_1, col_2 INTO var1, var2; RETURN; 

する必要があります何のために? ...いずれにしても、この質問にはより多くの情報が必要です:ウェブサービスとSPソースコード。また、問題をよりよく述べる必要があります。期待される行動は何ですか?説明できない「ステータス更新クエリ」とはどのように関連していますか?一人のユーザーがWebサービスにアクセスしたときの動作はどうですか?複数のユーザーがアクセスすると、どのように動作しますか?質問を編集して改善すると、私は下線を引っ込めます。 – mikemanne

+0

14分はタイプミスです。そのために残念。 – Deepak

+0

Webサービスは、データベースからレコードを読み取り、ステータスを読み取りとして更新するストアドプロシージャを呼び出します。別のユーザーがWebサービスを呼び出し、以前のトランザクションがステータスが更新されていない状態で実行されている場合、2番目のユーザーも同じレコードが返されます。したがって、呼び出しが並行しているときに2人のユーザーが同じレコードを返すことになります。予想される動作は、各ユーザーが一意のレコードを取得することです。 2つのWebサービスコールの間に時間差がない場合、この問題が発生します。詳細が必要な場合はお知らせください。 – Deepak

答えて

0

データベースの「読み取り」操作は、問題のレコードを更新するため、実際には読み取られません。必要なもののような音は、最初の読み込みと更新の操作が完了し、2回目の読み込みと更新の操作が始まる前にコミットすることです。

私はデータベース/オラクルの専門家ではないので、この回答がやや曖昧な場合はお詫び申し上げます。読んだり更新する操作の開始時に問題のテーブルをロックする方法がありますか設定?もしそうなら、それはあなたが探しているものを達成するはずです。

基本的に、そのテーブルへのシングルスレッドアクセスであり、同時ユーザー数とそのテーブルへのアクセス頻度によってパフォーマンスに影響を与える可能性があります。要件を達成する別の方法を検討することもできます。

+0

すべての応答ありがとう。私は読み取り操作のロックを設定しようとしましたが、明らかにOracleは、Select文のロックを許可していません。「Select for Update ..」はここで使用できません。私はDBへのリクエストを規制するために.Net側にキューを設定できるかどうか疑問に思っていました。私はこの結果が性能低下であると理解していますが、私はこの問題の解決策が必要です。 – Deepak

+0

この問題に対するGary Myersの解決策は有望に見えます - それはあなたのためには機能しませんでしたか?そして、なぜあなたは "select for update"を使うことができませんか? – mikemanne

+0

私は、照会の中で、 "Select for Update .."が許可していないby byとunion演算子を持っています。 – Deepak

1

あなたのストアドプロシージャコードのようなサウンドは、私たちがトレード「ドギー」と呼ぶものです。

一般的に、それはそれはおそらくステータスが

+0

私はより具体的な答えを提供できるよりも優れたOracle/SQLチョップを持つ人を知っていました!私は2度upvoteすることができればいいと思います.1回は解決のため、もう1回は 'dodgy'の使用です。 :) – mikemanne

関連する問題