Explorar o código

Merge branch 'master' into sh

shish hai 1 mes
pai
achega
699261ba75

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 1 - 1
app-ghs/controllers/OrderController.php


+ 42 - 0
biz-ghs/order/classes/OrderItemClass.php

@@ -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;

Algúns arquivos non se mostraron porque demasiados arquivos cambiaron neste cambio