|
|
@@ -339,6 +339,48 @@ class OrderItemClass extends BaseClass
|
|
|
$products = $respond['product'];
|
|
|
$weight = 0;
|
|
|
$mainId = $post['mainId'] ?? 0;
|
|
|
+
|
|
|
+ // --- 开始:死锁预防机制 ---
|
|
|
+ // 为了防止在高并发场景下,不同订单包含相同商品但顺序不同导致交叉死锁
|
|
|
+ // 我们提前提取所有涉及的花材ID,按照ID升序排列后统一加锁(SELECT FOR UPDATE)
|
|
|
+ if ($stockMayChange == true) {
|
|
|
+ $lockProductIds = [];
|
|
|
+ foreach ($products as $p) {
|
|
|
+ if (!empty($p['productId'])) {
|
|
|
+ $lockProductIds[] = $p['productId'];
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (!empty($lockProductIds)) {
|
|
|
+ $lockProductIds = array_unique($lockProductIds);
|
|
|
+ sort($lockProductIds);
|
|
|
+ foreach ($lockProductIds as $lockPId) {
|
|
|
+ ProductClass::getLockById($lockPId);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 同样为多颜色(xj)库存扣减做死锁预防
|
|
|
+ if (!empty($post['xj']) && is_array($post['xj'])) {
|
|
|
+ $lockXjIds = [];
|
|
|
+ foreach ($post['xj'] as $xjArr) {
|
|
|
+ if (is_array($xjArr)) {
|
|
|
+ foreach ($xjArr as $xjItem) {
|
|
|
+ if (!empty($xjItem['id'])) {
|
|
|
+ $lockXjIds[] = $xjItem['id'];
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (!empty($lockXjIds)) {
|
|
|
+ $lockXjIds = array_unique($lockXjIds);
|
|
|
+ sort($lockXjIds);
|
|
|
+ foreach ($lockXjIds as $lockXjId) {
|
|
|
+ XjClass::getLockById($lockXjId);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // --- 结束:死锁预防机制 ---
|
|
|
+
|
|
|
self::deleteByCondition(['orderSn' => $orderSn]);
|
|
|
foreach ($products as $key => $p) {
|
|
|
$p['orderSn'] = $orderSn;
|