bcquality/microsoft/knowledge/performance/batch-number-series-instead-of-getnextno-per-row.md
Jesper Schulz-Wedde b6da405376 Improve partner onboarding and documentation navigation
Lead with a complete plugin quick start and add task-oriented usage, troubleshooting, customization, and contribution guides. Preserve the broader plugin framing, correct conflicting contract guidance, support Agents folder reviews, and align repository validation. Convert existing sample references to clickable links without changing knowledge rules.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
2026-09-09 17:25:29 +02:00

1.9 KiB

bc-version domain keywords technologies countries application-area
22..
performance
no-series
getnextno
no-series-batch
savestate
numbersequence
lock
al
w1
all

Batch number-series calls instead of GetNextNo per insert

Contributions welcome — open a PR to refine or extend this article.

Description

Codeunit "No. Series".GetNextNo on a gapless (Normal) series updates and locks the number-series line on every call. A tight Insert loop that asks for a number per row serializes every concurrent writer on that series — the classic SaaS posting bottleneck. Training data still copies the per-row C/AL NoSeriesManagement shape. Series configured with Allow Gaps instead obtain numbers through NumberSequence and do not hold the series-line lock between calls, so they are not affected by this pattern. Codeunit "No. Series - Batch" issues gapless numbers in memory and writes the series line once via SaveState.

Best Practice

Inside a multi-row insert, call "No. Series - Batch".GetNextNo per row and SaveState once after the loop when the series must remain gapless. Use NumberSequence.Next when holes are allowed. Do not replace a single OnInsert GetNextNo for one master record; that path is not the hotspot.

See sample: batch-number-series-instead-of-getnextno-per-row.good.al.

Anti Pattern

NoSeries.GetNextNo(...) inside repeat ... Insert ... until Next() = 0 where the series is gapless (Allow Gaps = false). Each iteration takes the series-line lock. The signal is "No. Series" (not "No. Series - Batch") in a loop that inserts more than one row; do not flag the same pattern when the series has Allow Gaps enabled, as the NumberSequence path already avoids the lock.

See sample: batch-number-series-instead-of-getnextno-per-row.bad.al.