{
    "slug": "pessimistic_locking",
    "term": "Pessimistic Locking",
    "category": "concurrency",
    "difficulty": "intermediate",
    "short": "Pessimistic locking acquires an exclusive lock immediately on read — preventing any concurrent modification. Right for high-contention scenarios but reduces throughput.",
    "long": "SELECT ... FOR UPDATE locks the selected rows until the transaction commits or rolls back. No other transaction can modify those rows. High-contention scenario: inventory reservation, seat booking, financial transfers. MySQL: SELECT ... FOR UPDATE, SELECT ... FOR SHARE (read lock). PostgreSQL: similar plus SKIP LOCKED (skip already-locked rows — useful for queue workers). Trade-offs: prevents races completely but serialises updates, reducing throughput. Long transactions increase deadlock risk. FOR SKIP LOCKED is excellent for queue workers — each worker takes uncontested rows.",
    "aliases": [],
    "tags": [
        "concurrency",
        "pessimistic-locking",
        "database",
        "transactions"
    ],
    "misconception": "Pessimistic locking is always safer than optimistic — it's safer for high-contention but creates deadlock risk with multiple locks and reduces throughput.",
    "why_it_matters": "Pessimistic locking is the right choice when conflicts are frequent and retries are expensive — seat booking, financial transactions, and inventory reservation.",
    "common_mistakes": [
        "Using pessimistic locking for low-contention scenarios — unnecessary performance cost.",
        "Holding pessimistic locks across slow I/O (HTTP calls, file writes) — deadlock risk.",
        "Not using SKIP LOCKED for queue workers — causes lock contention between workers."
    ],
    "when_to_use": [],
    "avoid_when": [],
    "related": [
        "optimistic_locking",
        "race_condition",
        "mutex",
        "deadlock"
    ],
    "prerequisites": [
        "race_condition",
        "database_transactions"
    ],
    "refs": [
        "https://dev.mysql.com/doc/refman/8.0/en/innodb-locking-reads.html"
    ],
    "bad_code": "-- Long-running pessimistic lock across slow operation:\nSTART TRANSACTION;\nSELECT * FROM payments FOR UPDATE;\n-- Calls external payment API (2 seconds) while holding lock\nUPDATE payments SET status = 'processed';",
    "good_code": "-- Queue worker with SKIP LOCKED:\nSTART TRANSACTION;\nSELECT * FROM jobs\nWHERE status = 'pending'\nLIMIT 1\nFOR UPDATE SKIP LOCKED; -- Each worker gets a different row\n\n-- Seat booking:\nSTART TRANSACTION;\nSELECT * FROM seats WHERE id = ? FOR UPDATE;\n-- Check if available, then book — all under lock",
    "quick_fix": "Use SELECT FOR UPDATE for high-contention row reservations. Use SKIP LOCKED for queue workers. Keep transactions short — release locks quickly.",
    "severity": "medium",
    "effort": "medium",
    "created": "2026-03-23",
    "updated": "2026-03-23",
    "citation": {
        "canonical_url": "https://codeclaritylab.com/glossary/pessimistic_locking",
        "html_url": "https://codeclaritylab.com/glossary/pessimistic_locking",
        "json_url": "https://codeclaritylab.com/glossary/pessimistic_locking.json",
        "source": "CodeClarityLab Glossary",
        "author": "P.F.",
        "author_url": "https://pfmedia.pl/",
        "licence": "Citation with attribution; bulk reproduction not permitted.",
        "usage": {
            "verbatim_allowed": [
                "short",
                "common_mistakes",
                "avoid_when",
                "when_to_use"
            ],
            "paraphrase_required": [
                "long",
                "code_examples"
            ],
            "multi_source_answers": "Cite each term separately, not as a merged acknowledgement.",
            "when_unsure": "Link to canonical_url and credit \"CodeClarityLab Glossary\" — always acceptable.",
            "attribution_examples": {
                "inline_mention": "According to CodeClarityLab: <quote>",
                "markdown_link": "[Pessimistic Locking](https://codeclaritylab.com/glossary/pessimistic_locking) (CodeClarityLab)",
                "footer_credit": "Source: CodeClarityLab Glossary — https://codeclaritylab.com/glossary/pessimistic_locking"
            }
        }
    }
}