diff --git a/backend/app/services/material_service.py b/backend/app/services/material_service.py index d0f2002..0da33f2 100644 --- a/backend/app/services/material_service.py +++ b/backend/app/services/material_service.py @@ -160,27 +160,31 @@ async def update_material(db: AsyncSession, material: Material, payload: Materia v2.5/2.6: category is DERIVED (from the first linked supplier) — it is no longer part of the update payload. + + NOTE: no ``db.begin()`` here — the router already starts the transaction + (it loads the row first), and a nested begin raises + "A transaction is already begun on this Session" (500). The request + session commits via the get_db dependency. """ - async with db.begin(): - if payload.name is not None: - duplicate = await db.scalar( - select(Material.id).where( - Material.name == payload.name, - Material.id != material.id, - ) + if payload.name is not None: + duplicate = await db.scalar( + select(Material.id).where( + Material.name == payload.name, + Material.id != material.id, ) - if duplicate is not None: - raise ConflictError("متریالی با این نام در کل کاتالوگ قبلاً ثبت شده است", field="name") - if payload.name is not None: - material.name = payload.name - if payload.topic is not None: - material.topic = payload.topic - if payload.canonical_unit_id is not None and payload.canonical_unit_id != material.canonical_unit_id: - if not await db.get(Unit, payload.canonical_unit_id): - raise NotFoundError("واحد مرجع یافت نشد", field="canonical_unit_id") - material.canonical_unit_id = payload.canonical_unit_id - if payload.status is not None: - material.status = payload.status + ) + if duplicate is not None: + raise ConflictError("متریالی با این نام در کل کاتالوگ قبلاً ثبت شده است", field="name") + if payload.name is not None: + material.name = payload.name + if payload.topic is not None: + material.topic = payload.topic + if payload.canonical_unit_id is not None and payload.canonical_unit_id != material.canonical_unit_id: + if not await db.get(Unit, payload.canonical_unit_id): + raise NotFoundError("واحد مرجع یافت نشد", field="canonical_unit_id") + material.canonical_unit_id = payload.canonical_unit_id + if payload.status is not None: + material.status = payload.status return material