排他制御


Lock  2005-05-30 16:17:03  No: 122057  IP: [192.*.*.*]

こんにちは。
排他制御について質問があります。
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

編集 削除
。。。  2005-05-30 16:37:12  No: 122058  IP: [192.*.*.*]

肝心のDataBaseは何よ?
Oracleで話を進めてもいい?無駄に終わりそうだけど・・・。

編集 削除
 2005-05-30 16:41:53  No: 122059  IP: [192.*.*.*]

”Select ... For Update ”というSQL文を使って、試してください

編集 削除
Lock  2005-05-30 20:06:21  No: 122060  IP: [192.*.*.*]

申し訳ないです。SQL Serverです。

編集 削除
3−t  2005-05-30 21:04:18  No: 122061  IP: [192.*.*.*]

こういうことでいいのかな?

http://www.microsoft.com/japan/msdn/library/ja/acdata/ac_8_con_7a_1hf7.asp?frame=true

編集 削除
 2005-05-31 14:18:10  No: 122062  IP: [192.*.*.*]

>>    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

編集 削除
medaka  2005-05-31 14:28:05  No: 122063  IP: [192.*.*.*]

timestamp列のチェックもした方がいいかも

編集 削除