🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: fj.lang.visualbasic
2 messages
2 total messages Started by H.Shima Thu, 18 Dec 1997 00:00
Selectによるdeadlockの解決方法を教えて下さい
#947
Author: H.Shima
Date: Thu, 18 Dec 1997 00:00
80 lines
2922 bytes
始めて、投稿させて頂きます。

現在、SQL Server + VB4によるシステムを構築中なのですが、
誰か分かる方教えて下さい。

OpenResultsetメソッドを使用してSELECTクエリーを発行しているのですが、
結果が返ってくる迄、SELECTで使用しているテーブルに対して、
他のプロセスから更新を行うと、SELECT側がブロックしてしまって、
SELECTが完了するまで更新できません。
(複雑なSELECT文で実行時間が掛かると、deadlockがしばしば発生する)
PG中はロックしないようにReadOnlyに設定しているのですが・・・・
なにか間違えているのでしょうか教えて下さい。

現在の環境は下記の通りです。

	サーバ環境
		EXPRESS 5800/160Pro
		OS: Windows NT Server 4.0 SP2
		DBMS: MS SQL Server 6.5 SP2

	クライアント環境
		RsⅡ266
		OS: Windows 95 OSR2

	開発環境
		言語:Microsoft Visual Basic 4.0 Update2
		DBとの接続は、RDOによる信頼関係を使用しています。

*ブロックするPGのロジック
-------------------------------
Public gloDbConnect As rdoConnection
Private Sub XXXXXX()

	Dim SQL As String
	Dim objResultset As rdoResultset

	Set gloDbConnect = rdoEngine.rdoEnvironments(0).OpenConnection( _
			dsname:="IKKSQLSOURCE", _
			Prompt:=rdDriveNoPrompt, _
			ReadOnly:=False, _
			Connect:="DSN=IKKSQLSOURCE;")

	gloDbConnect.QueryTimeout = 0

	SQL = "SELECT * FROM Tablename WHERE ~"
	Set objResultset = gloDbConnect.OpenResultset( _
			Name:=SQL, _
			Type:=rdOpenForwardOnly, _
			LockType:=rdConcurReadOnly)
	%%%%%%%%%
End Sub
----------------------------

*ブロックされるPGのロジック
----------------------------
Public gloDbConnect As rdoConnection
Private Sub XXXXXX()

	Set gloDbConnect = rdoEngine.rdoEnvironments(0).OpenConnection( _
			dsname:="IKKSQLSOURCE", _
			Prompt:=rdDriveNoPrompt, _
			ReadOnly:=False, _
			Connect:="DSN=IKKSQLSOURCE;")

	gloDbConnect.QueryTimeout = 0

	gloDbConnect.Execute "INSERT TableName VALUES(1,2,3,4)"
	%%%%%%%%%
End Sub
----------------------------

ちなみに
ブロックする側が発行するSELECT文を取り出してISQL/Wから実行し、
ブロックされる側のPGを動かした場合、全く問題なく動作します。

************************
(株)ホクタテ 島
E-Mail: shima@tko.fitweb.or.jp
************************
Re: Selectによるdeadlockの解決方法を教えて下さい
#889
Author: H.Shima
Date: Mon, 29 Dec 1997 00:00
26 lines
1757 bytes
先日 SQL Server + VB4 のシステムにてテーブルブロックが発生するという問題で
どうしたら解決できるか質問していたのですが、解決策が分かりました。

----------
> OpenResultsetメソッドを使用してSELECTクエリーを発行しているのですが、
> 結果が返ってくる迄、SELECTで使用しているテーブルに対して、
> 他のプロセスから更新を行うと、SELECT側がブロックしてしまって、
> SELECTが完了するまで更新できません。
> (複雑なSELECT文で実行時間が掛かると、deadlockがしばしば発生する)
> PG中はロックしないようにReadOnlyに設定しているのですが・・・・
> なにか間違えているのでしょうか教えて下さい。
----------

よくよく調査するとVIEWを使用しているクエリーのみ
ブロックが発生していたことが分かりました。
そこでVIEW中の"FROM
Table名"の後に"(NOLOCK)"と入れたところテーブルブロックが発生しなくなりまし
た。大変お騒がせしました。

また、解決方法の発見に尽力くださった皆様に深く感謝いたします。 
 
************************
(株)ホクタテ 島
E-Mail: shima@tko.fitweb.or.jp
************************
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads