- - PR -
SQL SERVERの行ロックについて
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 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