@IT会議室は、ITエンジニアに特化した質問・回答コミュニティ「QA@IT」に生まれ変わりました。ぜひご利用ください。
- PR -

SQL SERVERの行ロックについて

1
投稿者投稿内容
passe
会議室デビュー日: 2004/07/27
投稿数: 2
投稿日時: 2004-08-27 17:32
こんにちは、passeです。

VB.NET2003とSQLServer8.0を使用してWINアプリの開発をしております。

DBのデータ取得時に取得した行のみに排他ロックをかけています。
ロックをかけるテーブルのPRIMARYキーを全部指定してデータを取得した際はその1行のみ排他がかかりますが、
テーブルのPRIMARYキーを全て指定せずにデータ取得した場合、取得した行以外のものまで排他がかかってしまいます…
取得したデータの行のみ排他ロックをかけたいです。

以下に現状況を記載致しますので、間違いがありましたらご指摘お願い致します。
他の方法がございましたらご伝授お願い致します。
わかりづらい説明で申し訳ないです…

<<ストアド>>==================================================================
SET LOCK_TIMEOUT 0

SELECT * FROM tblA WITH (ROWLOCK,UPDLOCK) WHERE primary1 = "1"

SET @エラーコードパラメータ = @@ERROR

=============================================================================
<<VB.NET>>===================================================================
Private Sub gettable()
 Try
    'トランザクションの開始
    SqlTransaction = SqlCon.BeginTransaction(IsolationLevel.Serializable)

    'system.data.sqlclient.SqlCommandの設定
    SqlCom = New SqlCommand("ストアド名", g_SqlCon, g_SqlTransaction)
    SqlCom.CommandType = System.Data.CommandType.StoredProcedure

    SqlCom.Parameters("@エラーコードパラメータ").Value = 0

    'ストアド実行
    SqlReader = SqlCom.ExecuteReader()

    'オブジェクトの破棄
    SqlReader.Close()

 Catch ex As Exception

    '閉じる
    SqlReader.Close()

    'トランザクションのキャンセル
    SqlTransaction.RollBack()

    'ロックのタイムアウトの判断
    If SqlCom.Parameters.Item("@エラーコードパラメータ").Value = "1222" Then
        messagebox.show("ロックがかかっています。")
    End If
 End Try
End Sub
=============================================================================
・テーブル(tblA)のPRIMARYキー(primary1,primary2)とします。
・テーブル(tblA)のデータ
|(primary1)|(primary2)|
|     1 |       1|
|     1 |       2|
|     1 |       3|
|     2 |       1|
|     3 |       1|

1.Aアプリで上記gettableプロシージャを実行。
2.Bアプリで上記gettableプロシージャを実行。(Aアプリのトランザクションは張ったままの状態)
3.結果
Bアプリで排他がかかっているデータが以下のようになります。
|(primary1)|(primary2)|
|      1 |       1|
|      1 |       2|
|      1 |      3|
|      2 |      1|
1

スキルアップ/キャリアアップ(JOB@IT)