あなたが説明するのは、標準的な並行性制御の問題です。Web開発の場合、問題を解決するために通常は楽観的同時実行制御を使用します。ASP.NET開発者は、おそらくMicrosoftSQLServerを使用してデータを保持します。SQL Serverは、非常に役立つタイプのデータ行バージョン(timestamp
データ型とも呼ばれます)をサポートしています。null許容でないrowversion
列は、意味的にはbinary(8)
列と同等です。の使用法の主な利点は、使用法のrowversion
単純さです。SQL Serverは、データベースに関連付けられた内部カウンターをサポートしています。カウンターは@@DBTS
変数ごとにアクセスできます。データベースのテーブルの行が変更されるたびに、列は自動的rowversion
に変更されますとの値に@@DBTS
インクリメント@@DBTS
されます。追加rowversion
の列を使用して、行の値が最後に読み取られてから変更されたかどうかを簡単に判断できます。
したがって、既存のデータベーステーブルがある場合は、行更新カウンターの行バージョン(タイムスタンプ)を保持する列を1つ追加するだけです。たとえば、ステートメント
ALTER TABLE dbo.Users ADD RowUpdateTimeStamp rowversion NOT NULL
RowUpdateTimeStamp
タイプの列をrowversion
テーブルに追加しますdbo.Users
。新しいUsersテーブルを作成すると、次のようなことができます。
CREATE TABLE dbo.Users (
Id int NOT NULL IDENTITY,
FirstName nvarchar(64) NOT NULL,
LastName nvarchar(64) NOT NULL,
RowUpdateTimeStamp rowversion NOT NULL,
CONSTRAINT PK_Users PRIMARY KEY CLUSTERED (Id ASC),
CONSTRAINT UC_Users_LastName_FirstName UNIQUE NONCLUSTERED (LastName ASC, FirstName ASC)
)
説明したテーブルが作成されますが、テーブルにRowUpdateTimeStamp
はタイプの追加の列がありrowversion
ます。もう一度、列に値を手動で保存する必要がないことを強調することが重要です。SQL Serverは、列の値を自動的に保存/変更します。
グリッドにテーブルのデータを入力すると、たとえば、データベーステーブルの列のRowVersion
値に非表示の列を含めることができます。RowUpdateTimeStamp
の対応する列の定義はcolModel
次のようになります。
name: "RowVersion", sortable: false, hidden: true, hidedlg: true,
editable: true, editrules: { edithidden: false }
これは、hiddenのRowVersion
値が、別の編集可能な列の値と一緒に送信されることを意味します。
グリッド行を変更するサーバーメソッドは、変更されたバージョンのを返しますRowUpdateTimeStamp
。インライン編集またはフォーム編集のaftersavefunc
コールバックを使用して、サーバーから返された値でグリッドの列を変更します。afterSubmit
RowVersion
サーバーがクライアントから変更要求を受信した場合、サーバーには常にRowVersion
変更行があります。サーバーコードは、データベース内の対応するデータの列の値が小さいか等しいかを確認し
RowUpdateTimeStamp
ます。データベースの価値が、別のユーザーがすでにデータを変更している場合よりも高くなります。サーバーがエラーHTTPコード(> = 300)を含むHTTP応答を返す場合。jqGridは応答をエラーとして解釈し、対応するエラーメッセージを表示します。errorTextFormatまたはerrorfuncを使用して、エラーメッセージをカスタマイズできます。
私はすべての生産的な実装で上記のアプローチを使用します。あなたは古い答えで主題についての追加情報を読むことができます。