0

ドメイン駆動設計では、ドメイン オブジェクトがアプリケーションに保持されず、必要に応じて作成および削除されることを理解するようになりました。

これにより、扱っているドメイン オブジェクトのバージョンを考慮する必要があるアプリケーションの新しい状況が発生する可能性があると考えています。

昔はユーザー名を更新していましたが、今はユーザー全体をオブジェクトとして取得して保存していますが、別のユーザーが同じものに加えた変更を上書きするリスクがあるのではないかと心配しています。物体。

この問題に対処する正しい方法は何ですか? データベースの単純なバージョン フィールド? ユーザーが上書きしようとしている状況にどのように対処しますか?

これを書いていると、おそらく古いアプリケーションで同様の問題があったことに気づきましたが、ドメインオブジェクトを扱うときは、それがより大きな問題だと感じています...

4

2 に答える 2

1

更新を行う方法は 2 つあります。楽観的ロックと悲観的ロックを参照してください。

おそらく、バージョン番号を使用して更新を行う楽観的ロックについて話しているでしょう。プリンシパルは単純です。更新は、他のスレッド/ユーザーが同じ (データベース) 行を更新しないことを望んでいるだけです。クエリには、対象のデータベース行に一致する (または一致しない) バージョンが含まれている必要があります。

このアプローチは、アプリケーション (データベース) のスループットを向上させます。これは、2 番目に可能なオプションである悲観的ロック - データベース内のこの行をロックし、トランザクションがコミットされるまで他のスレッド/クライアントを停止するだけです。

于 2013-08-28T11:38:10.370 に答える
1

この質問はphpでタグ付けされているので、DDDに固有のものではないと思います。この質問では、データベース レベルでの同時実行の問題も扱います。

バージョン番号列をデータベース テーブルに追加できます。次を使用して更新を実行します。

UPDATE user 
    SET name = 'Some new name', version = version + 1 
    WHERE id = 24 AND version = 42;

もちろん、42 は、レコードを照会したときにユーザーが持っていたバージョンに由来します。挿入は、バージョン番号が他の要求によって変更されていない場合にのみ成功します。更新カウントを確認し、カウントが 0 の場合は例外を投げるだけです。

これは、楽観的ロックと呼ばれるものの一般的な実装です。

Doctrine 2 などの一部の PHP Orm システムには、これが組み込まれています: http://docs.doctrine-project.org/en/latest/reference/transactions-and-concurrency.html

繰り返しますが、これはデータの永続性の問題であり、DDD ではないことを強調したいと思います。このバージョン プロパティをドメイン モデル レベルで使用するかどうかは疑問です。

于 2013-08-27T15:33:36.070 に答える