- - PR -
Webサービスを利用したDBへの同時アクセス
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2009-01-07 11:49
下記に内容をまとめたので、分かる方教えてください。
よろしくお願いします。 <やりたいこと> クライアントPCよりAPを実行すると、Webサービスを使ってDB(SQLSERVER)へアクセスし、抽出結果をクライアントPCへ返す。 <わからないこと> 処理は常に抽出(select)のみであるため、DBにロックはかけたくない。 (複数のクライアントがDBへ同時にアクセスしてくる可能性がある) そのため、SQLSERVERの同時実行制御機能に関するパラメータをREAD UNCOMMITTED(=ロックを立てない)にした。 しかし、同時アクセスできない。(=1台が処理中の間は、他のPCはDBをオープンできない) 同時アクセスできるようにするには、どうしたらいいか? <コード> Dim sqlConn As New SqlConnection("接続文字列") Dim sqlCmd As SqlCommand = sqlConn.CreateCommand Dim sqlReader As SqlDataReader Dim sqlTrans As SqlTransaction sqlCmd.CommandText = "SELECT * FROM tableName" sqlConn.Open() sqlTrans = sqlConn.BeginTransaction(IsolationLevel.ReadUncommitted) 'ロック無し sqlCmd.Transaction = sqlTrans sqlReader = sqlCmd.ExecuteReader() sqlCmd.Dispose() If sqlReader.Read() = True Then '処理 End If sqlReader.Close() sqlTrans.Commit() sqlConn.Close() [ メッセージ編集済み 編集者: rei 編集日時 2009-01-07 11:52 ] | ||||
|
投稿日時: 2009-01-07 15:41
この判定はどうやって行ったのでしょうか? デバッガで止めてないですよね? | ||||
|
投稿日時: 2009-01-07 20:40
SQLSERVERは詳しくは知らないですが、単純なselectでロックがかかるようなことはないはずですが。
| ||||
|
投稿日時: 2009-01-07 21:06
Webサービスの同時処理数は2まで?
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=8800&forum=7 | ||||
|
投稿日時: 2009-01-08 09:55
皆様、貴重な時間を割いていただき、ありがとうございます。
> todoさん 関連しそうなので、今から試してみます。 少し気になるのが、 @Webサービス1回の呼び出しで2スレッドが消費される。 Aデフォルトは、同時接続数2になっている。 Bリンクの質問者は、2クライアントまでアクセスできた。 →@、AからBは1クライアントしかアクセスできない気がするのですが・・・ もっとじっくり読み、試した後でここで報告させていただきます。 > deannaさん 私もそういう認識でおりました。 元々は、トランザクション処理にはせず、単純にselectするだけだったのですが、 同時アクセスできないために、トランザクション処理の中で敢えて"ロックを立てない" にしたのです。 > 囚人さま DBをオープンする前とオープンした後で戻り値を変えて試しました。 | ||||
|
投稿日時: 2009-01-08 11:25
> 同時アクセスできないために、トランザクション処理の中で敢えて"ロックを立てない"
> にしたのです。 単にロックヒントで NOLOCK 付けるだけでも良いですね まぁ、単純に select しているだけなら共有ロックしか取得されないはずなので ロックは関係ないかと。 とりあえず、Web サービスに原因があるのかどうかを知るために、 Windows アプリやコンソールアプリでも発生するかどうかを確認しておくと良いと思います。 _________________ C#と諸々 | ||||
|
投稿日時: 2009-01-08 12:15
皆さん、いろいろアドバイスありがとうございました。
質問の中で、@のようにしていましたが、実際のコードはAでした。 @に変更することで解決できました。 @ Dim sqlConn As New SqlConnection("接続文字列") Dim sqlCmd As SqlCommand = sqlConn.CreateCommand Dim sqlReader As SqlDataReader Dim sqlTrans As SqlTransaction A Shared sqlConn As New SqlConnection("接続文字列") ←Sharedで宣言 Dim sqlCmd As SqlCommand = sqlConn.CreateCommand Dim sqlReader As SqlDataReader Dim sqlTrans As SqlTransaction 正確に記述していれば、皆さんの貴重な時間を割かずに済んだところ、 大変申しわけなく感じます。 また、Shared→Dimにすることで、トランザクション処理にしなくても (トランザクション処理の中で敢えて"ロック無し"にしなくても) 同時アクセスできることも確認しました。 勉強不足で、まだ理解しきれないところもあります。 これから頑張っていきたいと思います。ありがとうございました。 >todoさん machine.configの修正を試してみましたが、Sharedでは解決しませんでした。 また、Dimに修正後、machine.configの修正を戻しましたが、同時アクセスできました。 [ メッセージ編集済み 編集者: rei 編集日時 2009-01-08 12:16 ] [ メッセージ編集済み 編集者: rei 編集日時 2009-01-08 12:30 ] |
1