1

アイテムのリビジョンごとに int 列があります。そのアイテムの最後のリビジョン番号を取得し、それを 1 つ増やして、作成中のこの新しいリビジョンに保存したいと考えています。

同じ項目が同時に改訂され、突然同じ番号の改訂が 2 つあるという問題が発生するのではないかと少し心配しています。

Item1  Revision 1
Item1  Revision 2
Item2  Revision 1
Item2  Revision 2
Item3  Revision 1

上記はすでに私のデータベースにある可能性があります。次に、Item1 に別のリビジョンを追加します。リビジョン「3」である必要があります。

アイテム 1 の最後のリビジョンが「2」であることを確認し、それを使用して、リビジョンが「3」であることを確認したいと考えています。

複数の人がリビジョン アイテム 1 を開始してほぼ同時に提出し、アイテム 1 を修正する 3 人全員のメモリにリビジョン 2 が戻ってくるのではないかと心配しています。

Item1 Revision 1
Item1 Revision 2
Item1 Revision 3
Item1 Revision 3 (should be 4)
4

2 に答える 2

1

EDIT:1)同じ行を更新する場合

NHibernate の機能があります。VersionorTimestampプロパティとそれを囲む強力な管理機能です。ここを読んでみてください:いつ Nhibernate を使用しますか? 詳細については。エキス

...エンティティ インスタンスには、数値またはタイムスタンプのバージョンがあります。Hibernate は、オブジェクトが変更されるとそのバージョンをインクリメントし、バージョンを自動的に比較し、競合が検出された場合は例外をスローします。したがって、このバージョン プロパティをすべての永続エンティティ クラスに追加して、楽観的ロックを有効にします。... バージョン番号は単なるカウンター値であり、有用なセマンティック値はありません。

NHibernate のドキュメント:

したがって、バージョンを使用すると、次のものが得られます。

  • Hibernate はバージョン値を増やします。
  • 誰かが古い、古いバージョンの値で行を更新しようとすると、StaleException がスローされます。
  • この問題を解決するためにハンドラを追加できます。これはコード次第です。

次に、より多くの標準機能 (インターセプターなど) を使用して、更新時のすべての変更を別のテーブルに監査することができます...現在のバージョン番号を使用します。

概要: NHibernate のバージョン管理システムがすべてを解決するわけではありません。StaleExceptions... が提供され、それらを処理する必要があります。しかし、一度に 1 つのバージョンだけが同じバージョン番号で保存されたことは確かです。

EDIT:2)新しい変更を新しい行として追跡する

私たちのアプローチに基づいて、これを提案として受け取ってください。これが、監査追跡システムとして変更を実装する方法です

IAuditable などのビジネス オブジェクトは次のように定義されます。

public class Article : IAuditable
{
  public virtual int ID { get; set; }
  public virtual string Text { get; set; }
  ...
  // if possible to move it to base for more Business Objects
  // public virtual IList<IHistory> History { get; set; }

  public virtual IList<ArticleHistory> History { get; set; }
}

更新があるたびに、記事自体が更新され、新しい ArticleHistory インスタンスが作成されます。その ID に HiLo ジェネレーターを使用すると、Web ファームでも正しく挿入されます。

このアプローチにより、Article の最新のインスタンスを操作し、パフォーマンスを向上させ (履歴は別のテーブルにあります)、AOP をサポートします (AuditAOPFilter を注入することで履歴追跡をオン/オフにします。履歴コレクションをロードする詳細でのみ。

これは提案です。これがあなたのシナリオに合わないことは理解できます(そして質問には答えません)。

于 2013-02-07T05:22:26.940 に答える
0

主キーとリビジョン番号の組み合わせで一意のキーを作成します。これにより、少なくとも DB での重複が防止されます。

残りの問題は、この並列編集が頻繁に発生すると予想される場合です。その場合、ユーザーの時間を節約するために、それを早期に検出するメカニズムを追加する必要があります。1 つの方法は、元の行でペシミスティック ロックを使用することです。

于 2013-02-07T07:50:26.280 に答える