1人のユーザが取得したデータが他のユーザに取得されないことを実現する

1419 ワード

ユーザが取得したデータが他のユーザに取得されないことを実現する.
質問:
ADOでデータベースにアクセスする場合、1つのテーブルから一定のレコード(例えば20行)を取り、取り出してプログラムで使用し、使用後にレコードを削除する(更新や削除しない).マルチユーザ操作(ユーザごとに同じ操作を採用する)では、1人のユーザが選択したレコードが他のユーザに選択されないことをどのように保証しますか?
解決方法:
このような問題を処理する一般的な方法は、フラグ列を追加し、各ユーザが取得したレコードにフラグを設定し、新しいユーザはフラグが未取得のレコードからのみレコードを取得することである.
この文書では、フラグ列を追加する必要がなく、トランザクションとロックを使用してデータの処理を制御します.
解決例:
  1.テスト環境の構築

     
       
        
      USE tempdb



GO



 



CREATE TABLE dbo.tb(



id int identity(1, 1), 



name nvarchar(128))



 



INSERT tb(name)



SELECT TOP 100 



name



FROM syscolumns



GO
     
       

  2.1番目のユーザーのシミュレーション

     
       
        
      --              



BEGIN TRAN



--          ,        



SET ROWCOUNT 20



SELECT * 



FROM tb WITH(UPDLOCK, READPAST)



-- UPDLOCK          , READPAST          
     
       

  3. 2番目のユーザーをシミュレートします(文は1番目のユーザーと同じで、別の接続でのみ実行されます).

     
       
        
      --              



BEGIN TRAN



--          ,        



SET ROWCOUNT 20



SELECT * 



FROM tb WITH(UPDLOCK, READPAST)



-- UPDLOCK          , READPAST          
     
       

  4.結果
クエリー・ウィンドウ1には上位20件のデータがリストされ、クエリー・ウィンドウ1には21~40件のデータがリストされています.
このとき、異なるユーザが異なるデータを取得する必要が実現する.
注記:処理が完了したら、レコードを削除し、トランザクションをコミットすればいいです.