こんにちは。
排他制御について質問があります。
BeginTransからCommitTransまでに更新処理するテーブルに対して
レコード単位ではなくテーブル単位に排他制御がかかります。
レコード単位に排他制御をかけたいのですが・・・
以下、コードです。
※得意先Mの主キーは得意先CD
Dim rst As New ADODB.Recordset
strBuf = " SELECT 得意先CD"
strBuf = strBuf & " FROM 得意先M"
strBuf = strBuf & " WHERE 得意先CD = '1001'
With rst
Set .ActiveConnection = conn
.Open strBuf, conn, adOpenKeyset, adLockPessimistic
If (.EOF) = False Then
UpdFlg = True
End If
'SQL CLOSE
.Close
Set rst = Nothing
End With
'存在する場合は更新
If booUpdFlg = True Then
strBuf = ""
strBuf = strBuf & " UPDATE 得意先M"
strBuf = strBuf & " SET 得意先CD.[得意先名] = '得意先1'
strBuf = strBuf & " WHERE 得意先CD = '1001'
conn.Execute (strBuf)
End If
肝心のDataBaseは何よ?
Oracleで話を進めてもいい?無駄に終わりそうだけど・・・。
”Select ... For Update ”というSQL文を使って、試してください
申し訳ないです。SQL Serverです。
こういうことでいいのかな?
http://www.microsoft.com/japan/msdn/library/ja/acdata/ac_8_con_7a_1hf7.asp?frame=true
>> strBuf = " SELECT 得意先CD"
>> strBuf = strBuf & " FROM 得意先M"
>> strBuf = strBuf & " WHERE 得意先CD = '1001'
というSQL文ですが、下記のものを追加したら、更新する時行の排他することができると思います。
conn.BeginTrans
strBuf = " SELECT 得意先CD"
strBuf = strBuf & " FROM 得意先M"
strBuf = strBuf & " WITH (ROWLOCK)" <----------
strBuf = strBuf & " WHERE 得意先CD = '1001'
’更新処理を行う
’
conn.CommitTrans
timestamp列のチェックもした方がいいかも
ツイート | ![]() |