-
Notifications
You must be signed in to change notification settings - Fork 0
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
楽観同時実行制御を行うサンプルを追加する #1237
Comments
ケースの洗い出しリソースの競合が発生しそうなケースと対応する場合の方針のネタ出しを行う。 下記の記載があるので、これに該当するケースがベスト。
コンカレンシーの競合の解決について、
コンカレンシートークンの設定
商品情報の更新と注文CatalogItems、CatalogBrands、CatalogCategoriesあたりのテーブルの更新 Good/Bad
在庫の更新と注文テーブル構造は要検討 Good/Bad
カートの更新Baskets 現状の挙動で、別タブで開き、 Good/Bad
選外支払い情報の更新①決済方法Aで決済を試みる(決済のステータスを変更しようとする) レビューやコメントの更新実際の機能としてはありそうだが、 プロモーションの更新ポイントやキャンペーンなど ユーザ情報更新カートの情報とやっていることが同じで、 |
|
ASP.NETの例だが、管理画面から複数人が同じ商品の情報を更新するパターン 楽観同時実行制御が向いているパターン
|
|
DbUpdateConcurrencyException 出力の確認BasketItemsにVersionカラムを追加し、デバッグ実行で Basketにカラム追加でも同じ動作だったので問題なし ShoppingApplicationService.SetBasketItemsQuantitiesAsync()について
をやると下記の通りDbUpdateConcurrencyExceptionを出力する
WHERE句の条件にVersionが入るようになっている bug: 2024/07/05 13:38:47.549 RelationalEventId.CommandExecuting[20100] (Microsoft.EntityFrameworkCore.Database.Command)
Executing DbCommand [Parameters=[@p1='?' (DbType = Int64), @p0='?' (DbType = Int32), @p2='?' (Size = 8) (DbType = Binary), @p4='?' (DbType = Int64), @p3='?' (Size = 64)], CommandType='Text', CommandTimeout='30']
SET NOCOUNT ON;
UPDATE [BasketItems] SET [Quantity] = @p0
OUTPUT INSERTED.[Version]
WHERE [Id] = @p1 AND [Version] = @p2;
UPDATE [Baskets] SET [BuyerId] = @p3
OUTPUT 1
WHERE [Id] = @p4; 下記のパターンでもUpdatedDateTimeが更新されていると同じようにDbUpdateConcurrencyExceptionを出力する [ConcurrencyCheck]
public DateTimeOffset UpdatedDateTime { get; set; } = DateTimeOffset.Now; |
シナリオ検討コンシューマーからのアクション(管理画面不要)で楽観同時実行制御が適したシナリオがないか検討する プロフィール情報ユーザーの登録情報操作により、ユーザーのプロフィール情報(住所氏名)が更新される。 erDiagram
Buyers ||--o{ Orders : has
Buyers {
bigint Id PK
varchar FullName
varchar PostalCode
varchar Todofuken
varchar Shikuchoson
varchar AzanaAndOthers
date LastUpdatedTime
}
Orders {
bigint Id PK
bigint BuyerId FK
}
決済情報ユーザーの決済により、決済のステータス(完了、決済中、未決済)が更新される。 erDiagram
Orders ||--o{ Payments : has
Orders {
bigint Id PK
varchar BuyerId
}
Payments {
bigint Id PK
bigint OrderId
decimal PaymentAmount "決済額"
varchar Status "ステータス"
date LastUpdatedTime "最終更新日時"
}
在庫情報ユーザーの注文により、在庫の数量が更新される。
erDiagram
CatalogItems ||--o{ Stocks : has
CatalogItems {
bigint Id PK
}
Stocks {
bigint Id PK
bigint CatalogItemId FK
int Quantity "数量"
date LastUpdatedTime "最終更新日時"
}
|
管理画面を作成する場合、フロントエンドでは
現在は下記の状態
|
フロントエンドのフォルダ構成
共通の設定ファイル --- 各ワークスペースに置く必要なし
├─ .gitignore
├─ .editorconfig
├─ .vscode/
│ ├─ extensions.json
│ ├─ settings.json
--- 各ワークスペースにも必要
├─ .eslintrc.cjs
├─ .prettierrc.json
└─ .stylelintrc.js |
タスクワークスペース化
管理用アプリの追加
|
課題既存のアプリはViteのプロキシ経由でSwaggerUI(/swagger)を開けるが、新規作成したアプリだと開けない バックとの連携がうまくいっていないため要調査 |
DbUpdateConcurrencyExceptionをcatchする場所
ApplicationServiceでtry-catchし、DbUpdateConcurrencyExceptionを業務例外に詰め直してスローすることも考えられるが、 try
{
await this.managementService.UpdateCatalogItemAsync(command);
}
catch (DbUpdateConcurrencyException ex)
{
this.logger.LogWarning(Events., ex, ex.Message);
return this.Conflict();
} |
操作とエラーハンドリング定義更新
削除
追加
|
概要
現状「.NETアプリケーションの処理方式」のトランザクション管理方針の中で、楽観同時実行制御を使うと書いている。
https://maris.alesinfiny.org/app-architecture/overview/dotnet-application-processing-system/transaction-management-policy/#preventing-update-conflicts
しかし、現状のDresscaのサンプルには楽観同時実行制御を行っている箇所がない(そのようなユースケースが存在しないので)。
サンプルとして実装が欲しいので、どこかに楽観同時実行制御を行うサンプルを入れたい。
無理にやるなら買い物かごとかに導入できるかもしれない。
例えばBasketにRowVersion(行バージョン)とLastUpdated(最終更新日時)のカラムを追加すれば、別画面等で買い物かごを同時更新するような場合に制御をかけることができる(更新競合した場合は画面をリロードが良いか?)。
複数画面で同時操作したときの業務的な仕様を先に決めてから、どのような制御を行うか設計する。
完了条件
The text was updated successfully, but these errors were encountered: