rows LockResultRow (1); a timeout raises an error IsTransientDatabaseError recognises.
ProtectedCallThe rows travel as one JSON array argument (OPENJSON / json_to_recordset), bounded per call by the driver's chunking.
Inserts when no message has this ID; rows MessageInsertedRow (0 = a message with this ID already exists).
ProtectedNewThe timeout is an argument of the lock procedure on both platforms, so nothing is prepared per transaction.
Takes a free or expired key, or re-takes this MessageID's own Reserved row; rows ReservationRow it now owns (0–1).
ProtectedStatementProtectedTableFor the rare raw statement (test-only helpers); never for a queue write.
Publish and deduplication-ledger calls (03 §2.1, F1, F10). The rules — insert only when no message has the ID, PublishedAt from the database clock, re-take only this MessageID's own Reserved row — live in the procedures; this class binds arguments in declared order.