購入時の在庫数処理を改善したい
- Dominant language
- PHP
- Stars
- 788
- Forks
- 719
- Avg merge
- 4d 4h
- Merged PRs (30d)
- 39
Description
## 概要(Overview)
StockReduceProcessorで在庫数を減らす為に冗長な処理をしており、そのため同一商品の購入処理が多い場合にボトルネックになってしまっています。ここを改善したいです。
## 期待する内容(Expect) or 要望 (Requirement)
現状在庫数の変更の手順としては
1. dtb_product_stockのレコードをロック
2. dtb_product_stockの値を更新
3. dtb_product_stockの値を取得しそこから購入数を減らす
4. dtb_product_stockとdtb_product_classのstockを新しい数でUPDATE
となっており処理が冗長だと感じます。
現状の実装では[直接stockを固定値で更新している](https://github.com/EC-CUBE/ec-cube/blob/8aa1e38f042f7427d6f8f28b56887ef0082bc6fb/src/Eccube/Service/PurchaseFlow/Processor/StockReduceProcessor.php#L95-L96)ため、最初に[参照元のstockを悲観ロックする](https://github.com/EC-CUBE/ec-cube/blob/8aa1e38f042f7427d6f8f28b56887ef0082bc6fb/src/Eccube/Service/PurchaseFlow/Processor/StockReduceProcessor.php#L88)必要が生じています。
ここをincrement/decrementのように差分更新にする事でクエリ数を少なく在庫数の更新が可能かと思います。
e.g.
```PHP
$this->entityManager()->createQuery('
UPDATE dtb_product_stock
SET stock = stock - 1
')
->execute();
```
この実装では事前にロックをする作業が不要になり、純粋な在庫数の増減処理のみで記述出来るかと思います。またこの実装だとトランザクション分離レベルをREAD COMMITTEDにしても実行に支障が出ないのでパフォーマンスチューニングの幅が広がります。
こちら如何でしょうか?
## 再現手順(Procedure)
なし
### 環境 (environment)
+ EC-CUBE: 4.0.1
+ PHP: 7.2.x
+ DB:
- MySQL 5.7.x
## 関連情報 (Ref)
- [既存実装の思想と思われる投稿](https://xoops.ec-cube.net/modules/newbb/viewtopic.php?topic_id=17797&forum=2&post_id=77157#forumpost77157)
Contributor guide
Assessment
This issue has not been assessed yet.