benchmarking-transaction-patterns
Guides benchmarking and comparing explicit multi-statement transactions versus single-statement CTE transactions in CockroachDB, with fair test methodology, contention analysis, and performance interpretation. Use when comparing transaction formulations, benchmarking CockroachDB workloads under contention, investigating retry pressure, or deciding whether to rewrite multi-step application flows into single SQL statements.
What this skill does
# Benchmarking Transaction Patterns Guides users through benchmarking, explaining, and comparing two formulations of the same transactional business workflow in CockroachDB: explicit multi-statement transactions versus single-statement CTE transactions. Focuses on performance under contention, fair test methodology, and result interpretation. **Complement to design skills:** For general transaction design principles, see [designing-application-transactions](../designing-application-transactions/SKILL.md). For SQL syntax and query patterns, see [cockroachdb-sql](../../cockroachdb-query-and-schema-design/cockroachdb-sql/SKILL.md). ## Core Concept Under contention, the transaction formulation itself is a primary performance lever. The **explicit model** (multi-statement `BEGIN`/`COMMIT`) keeps the transaction open across round trips, widening the contention window. The **CTE model** (single-statement) collapses the same logic into one atomic statement, reducing transaction duration and retries. ### Explicit Transaction Model ```sql BEGIN; SELECT balance FROM accounts WHERE id = $1; -- Application decides whether transfer is allowed UPDATE accounts SET balance = balance - $2 WHERE id = $1; UPDATE accounts SET balance = balance + $2 WHERE id = $3; INSERT INTO transfers (from_acct, to_acct, amount, created_at) VALUES ($1, $3, $2, now()); COMMIT; ``` ### CTE Transaction Model CockroachDB rejects multiple mutations of the same table in a single statement by default (`sql.multiple_modifications_of_table.enabled`), so the debit and credit are folded into one `UPDATE` using `CASE`. ```sql WITH funded AS ( SELECT 1 FROM accounts WHERE id = $1 AND balance >= $2 ), upd AS ( UPDATE accounts SET balance = CASE WHEN id = $1 THEN balance - $2 ELSE balance + $2 END WHERE id IN ($1, $3) AND EXISTS (SELECT 1 FROM funded) RETURNING id ), ins AS ( INSERT INTO transfers (from_acct, to_acct, amount, created_at) SELECT $1, $3, $2, now() WHERE (SELECT count(*) FROM upd) = 2 RETURNING id ) SELECT id FROM ins; ``` ## Steps ### 1. Prepare the Benchmark Environment Set up a dedicated test database and schema. Do not mix benchmark workloads with other traffic. ```sql CREATE DATABASE IF NOT EXISTS bankbench; USE bankbench; CREATE TABLE accounts ( id INT PRIMARY KEY, balance DECIMAL(18,2) NOT NULL DEFAULT 0 ); CREATE TABLE transfers ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), from_acct INT NOT NULL, to_acct INT NOT NULL, amount DECIMAL(18,2) NOT NULL, created_at TIMESTAMPTZ NOT NULL DEFAULT now() ); ``` ### 2. Seed the Test Data Use multi-row UPSERT for efficient seeding. Single-row inserts distort setup cost. ```sql INSERT INTO accounts (id, balance) SELECT generate_series(1, 10000), 1000.00 ON CONFLICT (id) DO UPDATE SET balance = 1000.00; ``` ### 3. Run the Explicit Transaction Benchmark Execute with realistic concurrency. Example using `pgbench` (PostgreSQL-compatible): ```bash # Create a pgbench script file: explicit_transfer.sql # \set from_id random(1, 10000) # \set to_id random(1, 10000) # \set amount 10.00 # BEGIN; # SELECT balance FROM accounts WHERE id = :from_id; # UPDATE accounts SET balance = balance - :amount WHERE id = :from_id; # UPDATE accounts SET balance = balance + :amount WHERE id = :to_id; # INSERT INTO transfers (from_acct, to_acct, amount, created_at) VALUES (:from_id, :to_id, :amount, now()); # COMMIT; pgbench -n -c 64 -j 8 -T 120 -f explicit_transfer.sql \ "postgresql://root@localhost:26257/bankbench?sslmode=disable" ``` Record throughput (tps), retries, p50/p95/p99 latency, max latency, and failures. ### 4. Reset Between Runs for Fair Comparison For a fair benchmark, reset account balances between explicit and CTE runs so table size, index size, and account state remain comparable. ```sql UPDATE accounts SET balance = 1000.00; ``` ### 5. Run the CTE Transaction Benchmark Execute with the same concurrency, duration, and parameters as the explicit run: ```bash # Create a pgbench script file: cte_transfer.sql containing the CTE query above pgbench -n -c 64 -j 8 -T 120 -f cte_transfer.sql \ "postgresql://root@localhost:26257/bankbench?sslmode=disable" ``` ### 6. Compare Results Always compare these metrics side by side: | Metric | What to Look For | |--------------------|------------------------------------------------------------------| | Throughput (txn/s) | Higher is better; CTE typically sustains better under contention | | Total retries | CTE often reduces to near-zero | | p50 latency | Median transaction time | | p95 latency | Tail latency under moderate contention | | p99 latency | Worst-case tail; explicit model often shows spikes | | Max latency | Outlier behavior | | Failures | Non-retryable errors | ### 7. Validate Benchmark Integrity Before interpreting results, verify the benchmark ran cleanly: ```sql -- Confirm expected transfer volume SELECT COUNT(*) AS total_transfers FROM transfers; ``` ```bash # Check node liveness and start times (no node restarts mid-benchmark) cockroach node status --certs-dir=<certs-dir> # or --insecure for an insecure cluster ``` ## Benchmark Reference Results In a reported high-contention run comparing the two models: | Metric | Explicit | CTE | Change | |-----------------|-------------|---------------|--------| | Throughput | 591.1 txn/s | 1,035.1 txn/s | +75.1% | | Wall time | 216.5s | 123.7s | -42.9% | | Average latency | 202.2 ms | 111.3 ms | -45.0% | | Total retries | 2,270,977 | 0 | -100% | Extended runs preserved the same directional result at higher total volume, with the explicit model continuing to accumulate retries and occasional failures while the CTE model stayed at zero retries and zero failures. ### Impact Summary | Dimension | Explicit Multi-Statement | Single-Statement CTE | |------------------------------|-------------------------------------|-------------------------| | Round trips | Multiple client/server interactions | Single request | | Transaction lifetime | Longer | Shorter | | Client retry complexity | Higher | Lower | | Atomic invariant enforcement | Spread across statements/app logic | Contained in SQL | | Expected throughput | Lower under contention | Higher under contention | | Client-visible retries | More likely | Often reduced | ## Decision Guidance ### Prefer the Explicit Pattern When - The business workflow truly cannot be expressed cleanly in one SQL statement - Readability or staged business logic matters more than peak throughput - The contention level is low enough that retry amplification is not the dominant cost ### Prefer the CTE Pattern When - The workflow is contention-heavy - The operation is naturally atomic - The application currently performs read-decide-write across multiple statements - The main goal is higher throughput, lower retries, and more stable p95/p99 latency ## Fair Benchmark Rules 1. **Reset between runs** for fair comparison so balances, table size, and index size stay consistent 2. **Treat no-reset runs as a demo**, not an apples-to-apples benchmark 3. **Use `--batch-size=1`** when you want one business unit of work at a time for clean comparison 4. **Compare the right metrics** — always include throughput, retries, p50, p95, p99, max latency, and failures 5. **Use multi-row UPSERT for seeding** — single-row seeding distorts setup cost ## Common Misconceptions
Related in Backend & APIs
jfrog
IncludedInteract with the JFrog Platform via the JFrog CLI and REST/GraphQL APIs. Use this skill when the user wants to manage Artifactory repositories, upload or download artifacts, manage builds, configure permissions, manage users and groups, work with access tokens, configure JFrog CLI servers, search artifacts, manage properties, set up replication, manage JFrog Projects, run security audits or scans, look up CVE details, query exposures scan results from JFrog Advanced Security, manage release bundles and lifecycle operations, aggregate or export platform data, or perform any JFrog Platform administration task. Also use when the user mentions jf, jfrog, artifactory, xray, distribution, evidence, apptrust, onemodel, graphql, workers, mission control, curation, advanced security, exposures, or any JFrog product name.
cupynumeric-migration-readiness
IncludedPre-migration readiness assessor for porting NumPy to cuPyNumeric. Use BEFORE substantial porting work begins when the user asks whether code will scale on GPU, whether they should migrate to cuPyNumeric, which NumPy patterns transfer cleanly, what must be refactored before porting, or mentions pre-port assessment, scaling analysis, or refactor planning. Inspect the user's source code, look up NumPy usage, cross-reference the cuPyNumeric API support manifest, and distinguish distributed-scaling-friendly patterns from blockers such as unsupported APIs, scalar synchronization, host round-trips, Python/object-heavy control flow, shape/data-dependent branching, and in-place mutation hazards. Produce a verdict of READY, LIGHT REFACTOR, SIGNIFICANT REFACTOR, or NOT RECOMMENDED, with concrete refactor pointers.
alibabacloud-data-agent-skill
IncludedInvoke Alibaba Cloud Apsara Data Agent for Analytics via CLI to perform natural language-driven data analysis on enterprise databases. Data Agent for Analytics is an intelligent data analysis agent developed by Alibaba Cloud Database team for enterprise users. It automatically completes requirement analysis, data understanding, analysis insights, and report generation based on natural language descriptions. This tool supports: discovering data resources (instances/databases/tables) managed in DMS, initiating query or deep analysis sessions, real-time progress tracking, and retrieving analysis conclusions and generated reports. Use this Skill when users need to query databases, analyze data trends, generate data reports, ask questions in natural language, or mention "Data Agent", "data analysis", "database query", "SQL analysis", "data insights".
token-optimizer
IncludedReduce OpenClaw token usage and API costs through smart model routing, heartbeat optimization, budget tracking, and native 2026.2.15 features (session pruning, bootstrap size limits, cache TTL alignment). Use when token costs are high, API rate limits are being hit, or hosting multiple agents at scale. The 4 executable scripts (context_optimizer, model_router, heartbeat_optimizer, token_tracker) are local-only — no network requests, no subprocess calls, no system modifications. Reference files (PROVIDERS.md, config-patches.json) document optional multi-provider strategies that require external API keys and network access if you choose to use them. See SECURITY.md for full breakdown.
resend-cli
IncludedUse this skill when the task is specifically about operating Resend from an AI agent, terminal session, or CI job via the official resend CLI: installing/authenticating the CLI, sending/listing/updating/cancelling emails, batch sends, domains and DNS, webhooks and local listeners, inbound receiving, contacts, topics, segments, broadcasts, templates, API keys, profiles, or debugging Resend CLI/API failures. Trigger on mentions of Resend CLI, `resend`, `resend doctor`, `resend emails send`, `resend domains`, `resend webhooks listen`, `resend emails receiving`, or agent-friendly terminal automation.
alibabacloud-odps-maxframe-coding
IncludedUse this skill for MaxFrame SDK development and documentation navigation on Alibaba Cloud MaxCompute (ODPS). Helps answer MaxFrame API, concept, official example, and supported pandas API questions; create data processing programs; read/write MaxCompute tables; debug jobs (remote or local); and build custom DPE runtime images. Trigger when users mention MaxFrame, MaxCompute with MaxFrame, ODPS table processing, DPE runtime, MaxFrame docs/examples, DataFrame/Tensor operations, or GPU runtime setup. Works for both English and Chinese queries about Alibaba Cloud data processing with MaxFrame.