MVCC는 갱신 시 기존 행을 곧바로 덮어쓰는 대신 여러 버전의 가시성을 관리하는 방식입니다. 읽는 트랜잭션은 자신의 스냅샷에 보이는 버전을 선택합니다.
데모에서 오래된 읽기는 v1의 100을 보고 새 읽기는 v2의 120을 봅니다. 필요 없는 옛 버전을 정리하는 작업도 중요하며, 구체적인 구현은 DB마다 다릅니다.
언제 쓰나
동시 읽기·쓰기의 관찰 결과나 오래 열린 트랜잭션의 비용을 분석할 때 이해해야 합니다.
행의 여러 버전으로 읽기 스냅샷과 새 쓰기를 함께 처리합니다.
<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>*{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}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는 갱신 시 기존 행을 곧바로 덮어쓰는 대신 여러 버전의 가시성을 관리하는 방식입니다. 읽는 트랜잭션은 자신의 스냅샷에 보이는 버전을 선택합니다.
데모에서 오래된 읽기는 v1의 100을 보고 새 읽기는 v2의 120을 봅니다. 필요 없는 옛 버전을 정리하는 작업도 중요하며, 구체적인 구현은 DB마다 다릅니다.
동시 읽기·쓰기의 관찰 결과나 오래 열린 트랜잭션의 비용을 분석할 때 이해해야 합니다.