2

Jqgrid行の更新について質問があります。以下のようなデータベーステーブルがあります。

id:1 field1:john field2:black

ユーザーがid=1という名前のフィールドを持つ最初の行を更新したいとします。ユーザーは行をダブルクリックして、行の詳細を開きます。ご覧のとおり、最初の行のfield1はjohnで、field2は黒です。たとえば、別のユーザーが最初のユーザーの後に同じ行をダブルクリックして、field2を赤に更新するとどうなりますか?最初のユーザーはまだ更新画面を表示しています。彼の画面では、field2はまだ黒です。その後、最初のユーザーはfield1をジャックとして更新し、行を保存するだけです。結果は、field1:ジャック、field2:黒になります。最初のユーザーがfield2の変更に気付いていなかったためです。そして、2番目のユーザーのfield2の変更はなくなりました。この例でデータの損失を防ぐにはどうすればよいですか?

ユーザーがダブルクリックして行の変更を保存すると、すべてのフィールドが更新されます。よろしくお願いします。

4

1 に答える 1

2

あなたが説明するのは、標準的な並行性制御の問題です。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コールバックを使用して、サーバーから返された値でグリッドの列を変更します。afterSubmitRowVersion

サーバーがクライアントから変更要求を受信した場合、サーバーには常にRowVersion変更行があります。サーバーコードは、データベース内の対応するデータの列の値が小さいか等しいかを確認し RowUpdateTimeStampます。データベースの価値が、別のユーザーがすでにデータを変更している場合よりも高くなります。サーバーがエラーHTTPコード(> = 300)を含むHTTP応答を返す場合。jqGridは応答をエラーとして解釈し、対応するエラーメッセージを表示します。errorTextFormatまたはerrorfuncを使用して、エラーメッセージをカスタマイズできます。

私はすべての生産的な実装で上記のアプローチを使用します。あなたは古い答えで主題についての追加情報を読むことができます。

于 2013-03-10T20:07:26.030 に答える