feat: add transaction-level advisory locks to sync_from_ui to prevent concurrent duplicate order processing
This commit is contained in:
parent
fd66566e91
commit
b5fa919327
@ -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)
|
||||
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user