mirror of
https://github.com/langgenius/dify.git
synced 2025-08-18 22:28:15 +00:00
bug: fix sequence number may be duplicated when multi-threads running the same workflow #21047 (#21153)
This commit is contained in:
parent
99acdcdef7
commit
918bb9a2f7
@ -151,12 +151,17 @@ class SQLAlchemyWorkflowExecutionRepository(WorkflowExecutionRepository):
|
|||||||
existing = session.scalar(select(WorkflowRun).where(WorkflowRun.id == domain_model.id_))
|
existing = session.scalar(select(WorkflowRun).where(WorkflowRun.id == domain_model.id_))
|
||||||
if not existing:
|
if not existing:
|
||||||
# For new records, get the next sequence number
|
# For new records, get the next sequence number
|
||||||
stmt = select(func.max(WorkflowRun.sequence_number)).where(
|
# in case multiple executions are created concurrently, use for update
|
||||||
|
stmt = (
|
||||||
|
select(func.coalesce(func.max(WorkflowRun.sequence_number), 0) + 1)
|
||||||
|
.where(
|
||||||
WorkflowRun.app_id == self._app_id,
|
WorkflowRun.app_id == self._app_id,
|
||||||
WorkflowRun.tenant_id == self._tenant_id,
|
WorkflowRun.tenant_id == self._tenant_id,
|
||||||
)
|
)
|
||||||
max_sequence = session.scalar(stmt)
|
.with_for_update()
|
||||||
db_model.sequence_number = (max_sequence or 0) + 1
|
)
|
||||||
|
next_seq = session.scalar(stmt)
|
||||||
|
db_model.sequence_number = int(next_seq) if next_seq is not None else 1
|
||||||
else:
|
else:
|
||||||
# For updates, keep the existing sequence number
|
# For updates, keep the existing sequence number
|
||||||
db_model.sequence_number = existing.sequence_number
|
db_model.sequence_number = existing.sequence_number
|
||||||
|
Loading…
x
Reference in New Issue
Block a user