bcquality/community/knowledge/performance/httpclient-inside-write-transaction-holds-locks.md
Stefano Demiliani ebceff2332 knowledge(performance): add community rules for JIT, locks, and false positives
These articles capture BC-specific mechanics agents still invert: partial-record JIT on writes, Reset clearing SetLoadFields, HttpClient inside write transactions, and batched number series, plus negative guidance that stops over-eager Query and IsEmpty "fixes".

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-20 15:57:58 +02:00

1.5 KiB

bc-version domain keywords technologies countries application-area
all
performance
httpclient
write-transaction
lock
commit
outbound-http
session-block
al
w1
all

Do not call HttpClient inside an open write transaction

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

Description

The first database write opens an AL write transaction that the runtime holds until the execution completes or Commit() runs — see understand-implicit-transaction-boundary.md. HttpClient blocks the session until the remote call returns. Any locks taken by earlier Insert/Modify/Delete therefore stay held for the HTTP wall-clock time, and interactive users see a spinner. This is not generic "don't block": it is the AL transaction model plus lock lifetime around outbound I/O.

Best Practice

Finish database writes and Commit() (or return from the write execution) before HttpClient.Send/Get/Post. If the call can be slow or retry, isolate it in a job queue or TaskScheduler task so UI and other sessions are not sitting on the writer's locks.

See sample: httpclient-inside-write-transaction-holds-locks.good.al.

Anti Pattern

Modify/Insert followed by HttpClient in the same procedure with no Commit between them. Detection signal: any HttpClient use after a write on the same execution path, especially in posting, page actions, or subscribers.

See sample: httpclient-inside-write-transaction-holds-locks.bad.al.