From b5fa91932700e1edfb9677b42f79b874a1fff089 Mon Sep 17 00:00:00 2001 From: Suherdy Yacob Date: Fri, 19 Jun 2026 09:27:31 +0700 Subject: [PATCH] feat: add transaction-level advisory locks to sync_from_ui to prevent concurrent duplicate order processing --- models/pos_order.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/models/pos_order.py b/models/pos_order.py index 40f2a13..449c8c6 100644 --- a/models/pos_order.py +++ b/models/pos_order.py @@ -100,3 +100,21 @@ class PosOrder(models.Model): return super(PosOrder, self)._process_order(order, existing_order) + @api.model + def sync_from_ui(self, orders): + """ + Override to prevent concurrent processing of the same order uuid. + Uses pg_advisory_xact_lock on the order's uuid to force subsequent + duplicate requests to wait until the first request completes/commits. + """ + # Sort orders by uuid to prevent potential deadlocks when locking multiple orders + sorted_orders = sorted(orders, key=lambda x: x.get('uuid') or '') + for order in sorted_orders: + uuid = order.get('uuid') + if uuid: + # Use PostgreSQL transaction-level advisory lock + self.env.cr.execute("SELECT pg_advisory_xact_lock(hashtext(%s))", (uuid,)) + + return super(PosOrder, self).sync_from_ui(orders) + +