![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
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で質問しましょう!
似たような質問が見つかりました
- Access(アクセス) Access DAOのExecuteメソッドのオプション(RecordsetOptionEnum)に 1 2022/09/19 07:34
- 格安スマホ・SIMフリースマホ SIMカードのロックについて 1 2022/03/29 15:02
- X(旧Twitter) Twitterのアカウントがロックされましたが 解除する方法とは…(切実) DMで挨拶したら突然アカ 1 2022/12/18 05:49
- iPad ワイモバイルのシンプルMプランのシェアプランのSIMが、ipadに使える設定方法を教えてください。 2 2023/08/16 11:34
- その他(セキュリティ) iPhoneに詳しい方お願いします 彼氏が毎回、スマホのパスワードを突破して 勝手にスマホの中見てき 4 2022/11/11 09:30
- タブレット 子供のタブレットのペアレンタルコントロール 1 2023/04/14 14:34
- 運転免許・教習所 運転免許証の暗証番号を勘違いで間違えてしまい、ロックされてしまいました。正しい暗証番号はもう分かって 1 2023/01/30 17:32
- Windows 10 Microsoft IMEを無効化する方法 1 2022/07/28 08:20
- その他(IT・Webサービス) [PayPay銀行キャッシュカード拾得の件] このメールは本物か? 6 2022/09/15 21:52
- Android(アンドロイド) auのAndroid端末のSIMカードがロックされてしまいました。 6 2022/08/22 20:31
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
accessのロック
-
DB2でSelectした時(rollback,c...
-
SELECT文でのデッドロックに対...
-
SELECT FOR UPDATE にトランザ...
-
トランザクションとlast_insert_id
-
max+1で初番する場合 for updat...
-
「マスタ」と「テーブル」の違...
-
コンボボックスで入力したもの...
-
Accessにインポートしたら並び...
-
ユニオンクエリの結果をテーブ...
-
ユニオンクエリで繋げられるテ...
-
accessのエクスポートエラーに...
-
2つのテーブルから条件に一致...
-
accessテーブル作成クエリを実...
-
ACCESS2007 フォーム 「バリア...
-
オラクルではできるのにSQLSERV...
-
ビューで引数を使いたい
-
PL/SQLでFROM句に変数を使いたい
-
accessでSQL実行時のテーブル名...
-
Access VBA Me.Requery レコー...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
SELECT時の行ロックの必要性に...
-
SELECT文でのデッドロックに対...
-
accessのロック
-
SQLServer Insertが遅い
-
Oracleの排他制御について教え...
-
INSERTにおいてロック処理は必要か
-
UPDATE文で発生するデッドロッ...
-
SELECT文でタイムアウト...
-
同時書き込み
-
AccessShareLock はどの程度気...
-
SELECT FOR UPDATE にトランザ...
-
更新ロックとデッドロック
-
max+1で初番する場合 for updat...
-
トランザクション中にSELECTし...
-
ExcelからAccess2013DBを更新す...
-
DB2でSelectした時(rollback,c...
-
DB2のロック調査
-
書き込みの衝突
-
排他ロックしたレコードが、別...
-
DB2の更新ロックについて
おすすめ情報