Multi-version concurrency control

다중 버전 동시성 제어

Multiple row versions let a reader keep its snapshot while a writer creates a newer version.

···
html
<div class="demo"><div class="head"><b>ROW VERSIONS</b><span>item 7</span></div><div class="stage versions"><div class="reader"><div class="pill">old reader</div><div class="cell old">v1 · 100</div></div><div class="reader"><div class="pill">new reader</div><div class="cell fresh">v2 · 120</div></div></div><div class="foot"><span id="mvccstatus">old snapshot → v1</span><span>writer can continue</span></div></div>
css
*{box-sizing:border-box}.demo{width:min(96vw,820px);height:min(94vh,350px);padding:clamp(8px,2vmin,18px);border:1px solid var(--line);border-radius:14px;background:var(--surface);color:var(--fg);display:flex;flex-direction:column;gap:clamp(5px,1.5vmin,12px);font:600 clamp(12px,3.5vmin,15px)/1.25 var(--font-sans),sans-serif;overflow:hidden}.head,.foot,.row{display:flex;justify-content:space-between;align-items:center;gap:8px}.head b{color:var(--accent)}.head span,.foot,.muted{color:var(--muted)}.stage{flex:1;min-height:0;display:flex;align-items:center;justify-content:center;gap:8px}.cell,.pill{border:1px solid var(--line);border-radius:8px;background:var(--bg);padding:clamp(4px,1.2vmin,9px);text-align:center}.pill{border-radius:999px}.on{border-color:var(--accent)!important;background:color-mix(in srgb,var(--accent) 17%,var(--surface))!important;color:var(--fg)!important}.bad{border-color:#e16a5d!important;background:color-mix(in srgb,#e16a5d 18%,var(--surface))!important}.foot{font-size:clamp(12px,3vmin,14px)}.versions{justify-content:space-around}.reader{display:grid;gap:8px;min-width:40%}.reader .pill,.reader .cell{width:100%}.old,.fresh{transition:.25s}
js
let n=0;function tick(){document.querySelector('.old').classList.toggle('on',!n);document.querySelector('.fresh').classList.toggle('on',!!n);document.getElementById('mvccstatus').textContent=n?'new snapshot → v2':'old snapshot → v1';n=1-n}tick();const t=setInterval(tick,1200);document.querySelector('.demo').onclick=()=>{clearInterval(t);tick()}

MVCC manages visibility of multiple row versions instead of simply overwriting a row on update. A reading transaction picks the version visible in its snapshot.

In the demo, an older reader sees v1 with 100 while a new reader sees v2 with 120. Cleanup of obsolete versions matters, and implementation details differ by database.

When to use

Understand it when analyzing concurrent reads and writes or the cost of long transactions.

Open as page ↗