@IT会議室は、ITエンジニアに特化した質問・回答コミュニティ「QA@IT」に生まれ変わりました。ぜひご利用ください。
- PR -

Webサービスを利用したDBへの同時アクセス

1
投稿者投稿内容
rei
会議室デビュー日: 2008/05/06
投稿数: 16
投稿日時: 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 ]
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2009-01-07 15:41
引用:

しかし、同時アクセスできない。(=1台が処理中の間は、他のPCはDBをオープンできない)


この判定はどうやって行ったのでしょうか?
デバッガで止めてないですよね?
deanna
大ベテラン
会議室デビュー日: 2004/08/23
投稿数: 118
投稿日時: 2009-01-07 20:40
SQLSERVERは詳しくは知らないですが、単純なselectでロックがかかるようなことはないはずですが。
todo
ぬし
会議室デビュー日: 2003/07/23
投稿数: 682
投稿日時: 2009-01-07 21:06
Webサービスの同時処理数は2まで?
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=8800&forum=7


rei
会議室デビュー日: 2008/05/06
投稿数: 16
投稿日時: 2009-01-08 09:55
皆様、貴重な時間を割いていただき、ありがとうございます。
> todoさん
関連しそうなので、今から試してみます。
少し気になるのが、
@Webサービス1回の呼び出しで2スレッドが消費される。
Aデフォルトは、同時接続数2になっている。
Bリンクの質問者は、2クライアントまでアクセスできた。
→@、AからBは1クライアントしかアクセスできない気がするのですが・・・
 
もっとじっくり読み、試した後でここで報告させていただきます。

> deannaさん
私もそういう認識でおりました。
元々は、トランザクション処理にはせず、単純にselectするだけだったのですが、
同時アクセスできないために、トランザクション処理の中で敢えて"ロックを立てない"
にしたのです。

> 囚人さま
DBをオープンする前とオープンした後で戻り値を変えて試しました。

よこけん
大ベテラン
会議室デビュー日: 2006/01/31
投稿数: 216
投稿日時: 2009-01-08 11:25
> 同時アクセスできないために、トランザクション処理の中で敢えて"ロックを立てない"
> にしたのです。

単にロックヒントで NOLOCK 付けるだけでも良いですね
まぁ、単純に select しているだけなら共有ロックしか取得されないはずなので
ロックは関係ないかと。

とりあえず、Web サービスに原因があるのかどうかを知るために、
Windows アプリやコンソールアプリでも発生するかどうかを確認しておくと良いと思います。

_________________
C#と諸々
rei
会議室デビュー日: 2008/05/06
投稿数: 16
投稿日時: 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

スキルアップ/キャリアアップ(JOB@IT)