
No.4ベストアンサー
- 回答日時:
単に、PKがIDだけではないとか、トランザクションをかけていないだけではないですか?
現在業務中のため、手元に環境がSQLサーバしかないので、
・クエリアナライザ
・VBScript
でやってみましたが、問題なしで普通にロックがかかりました。。。
私の行った方法が、そちらでもそのまま実現できるように、全て張っておきます。
※1.テスト環境構築⇒pubs設定にしてあります
----------------------------------------------------------------------------------------------------------------
USE pubs
GO
if EXISTS(SELECT * FROM sysobjects WHERE id = OBJECT_ID(N'[TBL_NAME]') AND OBJECTPROPERTY(id, N'IsUserTable') = 1)
DROP TABLE [TBL_NAME]
GO
CREATE TABLE [TBL_NAME] (
[ID] [numeric](8, 0) NOT NULL ,
[FLD] [char] (8) COLLATE Japanese_BIN NOT NULL
CONSTRAINT [XPKTBL_NAME] PRIMARY KEY CLUSTERED
(
[ID]
) ON [PRIMARY]
)
GO
INSERT INTO TBL_NAME VALUES(1,'A')
INSERT INTO TBL_NAME VALUES(2,'B')
INSERT INTO TBL_NAME VALUES(3,'C')
INSERT INTO TBL_NAME VALUES(4,'D')
INSERT INTO TBL_NAME VALUES(5,'E')
GO
SELECT * FROM TBL_NAME
GO
----------------------------------------------------------------------------------------------------------------
※2.ロック用のVBScript
(必要に応じてGetConnection()関数を変更してください)
----------------------------------------------------------------------------------------------------------------
Option Explicit
Call Main_Lock()
'メイン:ロック
Sub Main_Lock()
Dim adoCnn
Dim adoRec
Dim strSQL
Set adoCnn = GetConnection()
adoCnn.BeginTrans
strSQL = "SELECT * FROM TBL_NAME with (rowlock,updlock) WHERE ID IN(2,3,4)"
Set adoRec = adoCnn.Execute(strSQL)
MsgBox adoRec.RecordCount & "件のデータをロック中...更新用のVBScriptを実行ください"
adoCnn.CommitTrans
'またはRollbackTrans
adoCnn.Close
Set adoCnn = Nothing
End Sub
'汎用:コネクション
Private Function GetConnection()
CONST ADO_CUR_LOCATION_SERVER = 2 'ADODB.CursorLocationEnum.adUseServer
CONST ADO_CUR_LOCATION_CILENT = 3 'ADODB.CursorLocationEnum.adUseClient
Set GetConnection =CreateObject("ADODB.Connection")
GetConnection.CursorLocation = ADO_CUR_LOCATION_CILENT
GetConnection.Open "Provider=SQLOLEDB;" & _
"Data Source=(local);" & _
"Initial Catalog=pubs;", "sa", "sa"
End Function
----------------------------------------------------------------------------------------------------------------
※3.更新用のVBScript
(必要に応じてGetConnection()関数を変更してください)
----------------------------------------------------------------------------------------------------------------
Option Explicit
Call Main_Update()
'メイン:更新
Sub Main_Update()
Dim adoCnn
Dim strSQL
Set adoCnn = GetConnection()
strSQL = "UPDATE TBL_NAME SET FLD = 'わ' WHERE ID = 1"
Call adoCnn.Execute(strSQL)
Call Msgbox("STEP 1 終了")
strSQL = "UPDATE TBL_NAME SET FLD = 'わ' WHERE ID = 4"
Call adoCnn.Execute(strSQL)
Call Msgbox("STEP 2 終了")
strSQL = "UPDATE TBL_NAME SET FLD = 'わ' WHERE ID = 5"
Call adoCnn.Execute(strSQL)
Call Msgbox("STEP 3 終了")
adoCnn.Close
Set adoCnn = Nothing
End Sub
'汎用:コネクション
Private Function GetConnection()
CONST ADO_CUR_LOCATION_SERVER = 2 'ADODB.CursorLocationEnum.adUseServer
CONST ADO_CUR_LOCATION_CILENT = 3 'ADODB.CursorLocationEnum.adUseClient
Set GetConnection =CreateObject("ADODB.Connection")
GetConnection.CursorLocation = ADO_CUR_LOCATION_CILENT
GetConnection.Open "Provider=SQLOLEDB;" & _
"Data Source=(local);" & _
"Initial Catalog=pubs;", "sa", "sa"
End Function
この回答へのお礼
お礼日時:2005/12/12 10:43
返事が遅くなってすみませんでした。
おかげさまで、無事解決する事が出来ました。
ロック時のトランザクションのタイミングが悪かったようです。
ありがとうごさいました。
No.3
- 回答日時:
SQL自体を見ると、なぜロックされないのか不思議ですね。
SQLServerの識者にも聞いてみたんですが、Primary以外にインデクスを張っていると、
まれにそんな現象が起きてたかもしれないみたいなことを言ってました。
さらに、トランザクションの分離レベルとかの問題もあるんじゃないのかともいってます。
(要はプログラマレベルの作業でなくSE作業だから現地環境見ないとわからないとのことなのです)
※お役にたてずすいません。Oracleなどと違ってSQLServerは資料も少なくて大変ですね。
この回答へのお礼
お礼日時:2005/12/12 10:45
返事が遅くなってすみませんでした。
おかげさまで、無事解決する事が出来ました。
ロック時のトランザクションのタイミングが悪かったようです。
ありがとうごさいました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
accessのロック
-
SELECT文でのデッドロックに対...
-
INSERTにおいてロック処理は必要か
-
DB2でSelectした時(rollback,c...
-
SELECT時の行ロックの必要性に...
-
ADOで排他ロックがうまくいかない
-
同時書き込み
-
「マスタ」と「テーブル」の違...
-
SI Object Browserのテーブルス...
-
ACCESSのSQLで、NULLかNULLでな...
-
seoについておしえてください
-
ACCESS2007 フォーム 「バリア...
-
オラクルではできるのにSQLSERV...
-
3つ以上のテーブルをUNIONする...
-
Accessでの禁止文字チェック
-
AccessのSQLについて教えてくだ...
-
ACCESS 一番最新の日付の金額...
-
トリガが完全にかからない
-
ManagementStudioからのデータ削除
-
Access VBA Me.Requery レコー...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
SELECT文でのデッドロックに対...
-
SQLServer Insertが遅い
-
SELECT時の行ロックの必要性に...
-
accessのロック
-
AccessShareLock はどの程度気...
-
Oracleの排他制御について教え...
-
更新ロックとデッドロック
-
INSERTにおいてロック処理は必要か
-
DB2のロック調査
-
排他ロックしたレコードが、別...
-
トランザクションとlast_insert_id
-
SELECT文でタイムアウト...
-
トランザクション中にSELECTし...
-
デッドロックが発生します。
-
ExcelからAccess2013DBを更新す...
-
UPDATE文で発生するデッドロッ...
-
トランザクション処理について
-
DB2でSelectした時(rollback,c...
-
パススルークエリでのロックに...
-
SELECT FOR UPDATE にトランザ...
おすすめ情報