[{"data":1,"prerenderedAt":123},["ShallowReactive",2],{"term-o\u002Foptimistic-locking":3,"related-o\u002Foptimistic-locking":108},{"id":4,"title":5,"acronym":6,"body":7,"category":89,"description":90,"difficulty":91,"extension":92,"letter":93,"meta":94,"navigation":95,"path":96,"related":97,"seo":102,"sitemap":103,"stem":106,"subcategory":6,"__hash__":107},"terms\u002Fterms\u002Fo\u002Foptimistic-locking.md","Optimistic Locking",null,{"type":8,"value":9,"toc":83},"minimark",[10,15,19,23,26,30,72,76,79],[11,12,14],"h2",{"id":13},"eli5-the-vibe-check","ELI5 — The Vibe Check",[16,17,18],"p",{},"Optimistic locking assumes conflicts are rare so it does not lock the row upfront. Instead, it adds a version number to each row. When you update, it checks if the version matches what you read. If someone else changed it first, your update fails and you retry. Less locking, more retrying.",[11,20,22],{"id":21},"real-talk","Real Talk",[16,24,25],{},"Optimistic locking is a concurrency control strategy that checks for conflicts at write time rather than locking rows during reads. It is implemented by adding a version or timestamp column. Before updating, the query verifies the version matches. If another transaction modified the row first, the update affects 0 rows, signaling a conflict. Used when conflicts are infrequent.",[11,27,29],{"id":28},"show-me-the-code","Show Me The Code",[31,32,37],"pre",{"className":33,"code":34,"language":35,"meta":36,"style":36},"language-sql shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","-- Check version before updating\nUPDATE products\nSET stock = stock - 1, version = version + 1\nWHERE id = 42 AND version = 7;\n-- If 0 rows updated, someone else changed it first\n","sql","",[38,39,40,48,54,60,66],"code",{"__ignoreMap":36},[41,42,45],"span",{"class":43,"line":44},"line",1,[41,46,47],{},"-- Check version before updating\n",[41,49,51],{"class":43,"line":50},2,[41,52,53],{},"UPDATE products\n",[41,55,57],{"class":43,"line":56},3,[41,58,59],{},"SET stock = stock - 1, version = version + 1\n",[41,61,63],{"class":43,"line":62},4,[41,64,65],{},"WHERE id = 42 AND version = 7;\n",[41,67,69],{"class":43,"line":68},5,[41,70,71],{},"-- If 0 rows updated, someone else changed it first\n",[11,73,75],{"id":74},"when-youll-hear-this","When You'll Hear This",[16,77,78],{},"\"Use optimistic locking for low-conflict scenarios to avoid blocking.\" \u002F \"The ORM uses a version column for optimistic locking automatically.\"",[80,81,82],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":36,"searchDepth":50,"depth":50,"links":84},[85,86,87,88],{"id":13,"depth":50,"text":14},{"id":21,"depth":50,"text":22},{"id":28,"depth":50,"text":29},{"id":74,"depth":50,"text":75},"database","Optimistic locking assumes conflicts are rare so it does not lock the row upfront. Instead, it adds a version number to each row.","advanced","md","o",{},true,"\u002Fterms\u002Fo\u002Foptimistic-locking",[98,99,100,101],"Pessimistic Locking","Locking","Race Condition","Transaction",{"title":5,"description":90},{"changefreq":104,"priority":105},"weekly",0.7,"terms\u002Fo\u002Foptimistic-locking","L1MXb87Ot0n2ySxAETWR0fNKNI7ehK6kEcvY2HesLdE",[109,112,115,120],{"title":99,"path":110,"acronym":6,"category":89,"difficulty":91,"description":111},"\u002Fterms\u002Fl\u002Flocking","Locking prevents two transactions from modifying the same data at the same time. It is how databases coordinate concurrent access.",{"title":98,"path":113,"acronym":6,"category":89,"difficulty":91,"description":114},"\u002Fterms\u002Fp\u002Fpessimistic-locking","Pessimistic locking assumes conflicts are likely, so it locks the row the moment you read it. Nobody else can touch it until you are done.",{"title":100,"path":116,"acronym":6,"category":117,"difficulty":118,"description":119},"\u002Fterms\u002Fr\u002Frace-condition","general","intermediate","A race condition is when two parts of your code are racing to do something at the same time and the winner isn't guaranteed — leading to unexpected, hard-t...",{"title":101,"path":121,"acronym":6,"category":89,"difficulty":118,"description":122},"\u002Fterms\u002Ft\u002Ftransaction","A transaction groups multiple database operations into one all-or-nothing bundle. Either ALL of them succeed, or NONE of them happen.",1776518299592]