1人のユーザが取得したデータが他のユーザに取得されないことを実現する
1419 ワード
ユーザが取得したデータが他のユーザに取得されないことを実現する.
質問:
ADOでデータベースにアクセスする場合、1つのテーブルから一定のレコード(例えば20行)を取り、取り出してプログラムで使用し、使用後にレコードを削除する(更新や削除しない).マルチユーザ操作(ユーザごとに同じ操作を採用する)では、1人のユーザが選択したレコードが他のユーザに選択されないことをどのように保証しますか?
解決方法:
このような問題を処理する一般的な方法は、フラグ列を追加し、各ユーザが取得したレコードにフラグを設定し、新しいユーザはフラグが未取得のレコードからのみレコードを取得することである.
この文書では、フラグ列を追加する必要がなく、トランザクションとロックを使用してデータの処理を制御します.
解決例:
1.テスト環境の構築
2.1番目のユーザーのシミュレーション
3. 2番目のユーザーをシミュレートします(文は1番目のユーザーと同じで、別の接続でのみ実行されます).
4.結果
クエリー・ウィンドウ1には上位20件のデータがリストされ、クエリー・ウィンドウ1には21~40件のデータがリストされています.
このとき、異なるユーザが異なるデータを取得する必要が実現する.
注記:処理が完了したら、レコードを削除し、トランザクションをコミットすればいいです.
質問:
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件のデータがリストされています.
このとき、異なるユーザが異なるデータを取得する必要が実現する.
注記:処理が完了したら、レコードを削除し、トランザクションをコミットすればいいです.