<!-- CANARY: REQ=REQ-DOCS-001; FEATURE="Docs"; ASPECT=Documentation; STATUS=TESTED; OWNER=docs; UPDATED=2026-01-15 -->
<h2 id="concurrency-control-in-geode" class="position-relative d-flex align-items-center group">
<span>Concurrency Control in Geode</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="concurrency-control-in-geode"
aria-haspopup="dialog"
aria-label="Share link: Concurrency Control in Geode">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h2><div id="headingShareModal" class="heading-share-modal" role="dialog" aria-modal="true" aria-labelledby="headingShareTitle" hidden>
<div class="hsm-dialog" role="document">
<div class="hsm-header">
<h2 id="headingShareTitle" class="h6 mb-0 fw-bold">Share this section</h2>
<button type="button" class="hsm-close" aria-label="Close">
<i class="fa-solid fa-xmark"></i>
</button>
</div>
<div class="hsm-body">
<label for="headingShareInput" class="form-label small text-muted mb-1 text-uppercase fw-bold" style="font-size: 0.7rem; letter-spacing: 0.5px;">Permalink</label>
<div class="input-group mb-4 hsm-url-group">
<input id="headingShareInput" type="text" class="form-control font-monospace" readonly aria-readonly="true" style="font-size: 0.85rem;" />
<button class="btn btn-primary hsm-copy" type="button" aria-label="Copy" title="Copy">
<i class="fa-duotone fa-clipboard" aria-hidden="true"></i>
</button>
</div>
<div class="small fw-bold mb-2 text-muted text-uppercase" style="font-size: 0.7rem; letter-spacing: 0.5px;">Share via</div>
<div class="hsm-share-grid">
<a id="share-twitter" class="btn btn-outline-secondary w-100" target="_blank" rel="noopener noreferrer">
<i class="fa-brands fa-twitter me-2"></i>Twitter
</a>
<a id="share-linkedin" class="btn btn-outline-secondary w-100" target="_blank" rel="noopener noreferrer">
<i class="fa-brands fa-linkedin me-2"></i>LinkedIn
</a>
<a id="share-facebook" class="btn btn-outline-secondary w-100" target="_blank" rel="noopener noreferrer">
<i class="fa-brands fa-facebook me-2"></i>Facebook
</a>
</div>
</div>
</div>
</div>
<style>
.heading-share-modal {
position: fixed;
inset: 0;
display: flex;
justify-content: center;
align-items: center;
background: rgba(0, 0, 0, 0.6);
z-index: 1050;
padding: 1rem;
backdrop-filter: blur(4px);
-webkit-backdrop-filter: blur(4px);
}
.heading-share-modal[hidden] { display: none !important; }
.hsm-dialog {
max-width: 420px;
width: 100%;
background: var(--bs-body-bg, #fff);
color: var(--bs-body-color, #212529);
border: 1px solid var(--bs-border-color, rgba(0,0,0,0.1));
border-radius: 1rem;
box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25);
overflow: hidden;
animation: hsm-fade-in 0.2s ease-out;
}
@keyframes hsm-fade-in {
from { opacity: 0; transform: scale(0.95); }
to { opacity: 1; transform: scale(1); }
}
[data-bs-theme="dark"] .hsm-dialog {
background: #1e293b;
border-color: rgba(255,255,255,0.1);
color: #f8f9fa;
}
.hsm-header {
display: flex;
justify-content: space-between;
align-items: center;
padding: 1rem 1.5rem;
border-bottom: 1px solid var(--bs-border-color, rgba(0,0,0,0.1));
background: rgba(0,0,0,0.02);
}
[data-bs-theme="dark"] .hsm-header {
background: rgba(255,255,255,0.02);
border-color: rgba(255,255,255,0.1);
}
.hsm-close {
background: transparent;
border: none;
color: inherit;
opacity: 0.5;
padding: 0.25rem 0.5rem;
border-radius: 0.25rem;
font-size: 1.2rem;
line-height: 1;
transition: opacity 0.2s;
}
.hsm-close:hover {
opacity: 1;
}
.hsm-body {
padding: 1.5rem;
}
.hsm-url-group {
display: flex !important;
align-items: stretch;
}
.hsm-url-group .form-control {
flex: 1;
min-width: 0;
margin: 0;
background: var(--bs-secondary-bg, #f8f9fa);
border-color: var(--bs-border-color, #dee2e6);
border-top-right-radius: 0;
border-bottom-right-radius: 0;
height: 42px;
}
.hsm-url-group .btn {
flex: 0 0 auto;
margin: 0;
margin-left: -1px;
border-top-left-radius: 0;
border-bottom-left-radius: 0;
height: 42px;
display: flex;
align-items: center;
justify-content: center;
padding: 0 1.25rem;
z-index: 2;
}
[data-bs-theme="dark"] .hsm-url-group .form-control {
background: #0f172a;
border-color: #334155;
color: #e2e8f0;
}
.hsm-share-grid {
display: flex;
flex-direction: column;
gap: 0.5rem;
}
.hsm-share-grid .btn {
display: flex;
align-items: center;
justify-content: center;
font-size: 0.9rem;
padding: 0.6rem;
border-color: var(--bs-border-color);
width: 100%;
}
[data-bs-theme="dark"] .hsm-share-grid .btn {
color: #e2e8f0;
border-color: #475569;
}
[data-bs-theme="dark"] .hsm-share-grid .btn:hover {
background: #334155;
border-color: #cbd5e1;
}
</style>
<script>
(function(){
const modal = document.getElementById('headingShareModal');
if(!modal) return;
const input = modal.querySelector('#headingShareInput');
const copyBtn = modal.querySelector('.hsm-copy');
const twitter = modal.querySelector('#share-twitter');
const linkedin = modal.querySelector('#share-linkedin');
const facebook = modal.querySelector('#share-facebook');
const closeBtn = modal.querySelector('.hsm-close');
let lastFocus=null;
let trapBound=false;
function buildUrl(id){ return window.location.origin + window.location.pathname + '#' + id; }
function isOpen(){ return !modal.hasAttribute('hidden'); }
function hydrate(id){
const url=buildUrl(id);
input.value=url;
const enc=encodeURIComponent(url);
const text=encodeURIComponent(document.title);
if(twitter) twitter.href=`https://twitter.com/intent/tweet?url=${enc}&text=${text}`;
if(linkedin) linkedin.href=`https://www.linkedin.com/sharing/share-offsite/?url=${enc}`;
if(facebook) facebook.href=`https://www.facebook.com/sharer/sharer.php?u=${enc}`;
}
function openModal(id){
lastFocus=document.activeElement;
hydrate(id);
if(!isOpen()){
modal.removeAttribute('hidden');
}
requestAnimationFrame(()=>{ input.focus(); });
trapFocus();
}
function closeModal(){
if(!isOpen()) return;
modal.setAttribute('hidden','');
if(lastFocus && typeof lastFocus.focus==='function') lastFocus.focus();
}
function copyCurrent(){
try{ navigator.clipboard.writeText(input.value).then(()=>feedback(true),()=>fallback()); }
catch(e){ fallback(); }
}
function fallback(){ input.select(); try{ document.execCommand('copy'); feedback(true);}catch(e){ feedback(false);} }
function feedback(ok){ if(!copyBtn) return; const icon=copyBtn.querySelector('i'); if(!icon) return; const prev=copyBtn.getAttribute('data-prev')||icon.className; if(!copyBtn.getAttribute('data-prev')) copyBtn.setAttribute('data-prev',prev); icon.className= ok ? 'fa-duotone fa-clipboard-check':'fa-duotone fa-circle-exclamation'; setTimeout(()=>{ icon.className=prev; },1800); }
function handleShareClick(e){ e.preventDefault(); const btn=e.currentTarget; const id=btn.getAttribute('data-share-target'); if(id) openModal(id); }
function bindShareButtons(){
document.querySelectorAll('.h-share').forEach(btn=>{
if(!btn.dataset.hShareBound){ btn.addEventListener('click', handleShareClick); btn.dataset.hShareBound='1'; }
});
}
bindShareButtons();
if(document.readyState==='loading'){
document.addEventListener('DOMContentLoaded', bindShareButtons);
} else {
requestAnimationFrame(bindShareButtons);
}
document.addEventListener('click', function(e){
const shareBtn=e.target.closest && e.target.closest('.h-share');
if(shareBtn && !shareBtn.dataset.hShareBound){ handleShareClick.call(shareBtn, e); }
}, true);
document.addEventListener('click', e=>{
if(e.target===modal) closeModal();
if(e.target.closest && e.target.closest('.hsm-close')){ e.preventDefault(); closeModal(); }
if(copyBtn && (e.target===copyBtn || (e.target.closest && e.target.closest('.hsm-copy')))) { e.preventDefault(); copyCurrent(); }
});
document.addEventListener('keydown', e=>{ if(e.key==='Escape' && isOpen()) closeModal(); });
function trapFocus(){
if(trapBound) return;
trapBound=true;
modal.addEventListener('keydown', f=>{ if(f.key==='Tab' && isOpen()){ const focusable=[...modal.querySelectorAll('a[href],button,input,textarea,select,[tabindex]:not([tabindex="-1"])')].filter(el=>!el.hasAttribute('disabled')); if(!focusable.length) return; const first=focusable[0]; const last=focusable[focusable.length-1]; if(f.shiftKey && document.activeElement===first){ f.preventDefault(); last.focus(); } else if(!f.shiftKey && document.activeElement===last){ f.preventDefault(); first.focus(); } } });
}
if(closeBtn) closeBtn.addEventListener('click', e=>{ e.preventDefault(); closeModal(); });
})();
</script><p>Concurrency control manages simultaneous access to database resources, ensuring data consistency while maximizing throughput. Geode implements sophisticated concurrency mechanisms based on Multi-Version Concurrency Control (MVCC) and Serializable Snapshot Isolation (SSI), enabling high-performance concurrent operations without compromising ACID guarantees.</p>
<h3 id="introduction-to-database-concurrency" class="position-relative d-flex align-items-center group">
<span>Introduction to Database Concurrency</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="introduction-to-database-concurrency"
aria-haspopup="dialog"
aria-label="Share link: Introduction to Database Concurrency">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3><p>When multiple clients access a database simultaneously, conflicts can arise:</p>
<ul>
<li><strong>Read-Write Conflicts</strong>: One transaction reads data while another modifies it</li>
<li><strong>Write-Write Conflicts</strong>: Two transactions modify the same data concurrently</li>
<li><strong>Phantom Reads</strong>: Query results change due to concurrent inserts/deletes</li>
<li><strong>Lost Updates</strong>: One transaction’s changes overwrite another’s</li>
</ul>
<p>Traditional locking approaches (pessimistic concurrency) prevent conflicts by blocking operations, but reduce throughput. Modern databases like Geode use optimistic approaches that allow conflicts but detect and resolve them, providing both consistency and performance.</p>
<h3 id="geodes-concurrency-architecture" class="position-relative d-flex align-items-center group">
<span>Geode&rsquo;s Concurrency Architecture</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="geodes-concurrency-architecture"
aria-haspopup="dialog"
aria-label="Share link: Geodes Concurrency Architecture">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3>
<h4 id="multi-version-concurrency-control-mvcc" class="position-relative d-flex align-items-center group">
<span>Multi-Version Concurrency Control (MVCC)</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="multi-version-concurrency-control-mvcc"
aria-haspopup="dialog"
aria-label="Share link: Multi-Version Concurrency Control (MVCC)">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p>MVCC maintains multiple versions of data, allowing readers and writers to proceed without blocking each other:</p>
<p><strong>How it works</strong>:</p>
<ol>
<li>Each transaction sees a consistent snapshot of the database</li>
<li>Writes create new versions rather than modifying existing data</li>
<li>Readers access appropriate versions based on transaction start time</li>
<li>Old versions are garbage collected when no longer needed</li>
</ol>
<p><strong>Benefits</strong>:</p>
<ul>
<li><strong>Readers never block writers</strong> (and vice versa)</li>
<li><strong>Consistent reads</strong> without locks</li>
<li><strong>High throughput</strong> for read-heavy workloads</li>
<li><strong>Point-in-time queries</strong> possible</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="err">--</span><span class="w"> </span><span class="py">Transaction</span><span class="w"> </span><span class="py">1</span><span class="w"> </span><span class="py">starts</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">BEGIN</span><span class="w"> </span><span class="py">TRANSACTION</span><span class="err">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">u</span><span class="p">:</span><span class="nc">User</span><span class="w"> </span><span class="p">{</span><span class="py">id</span><span class="p">:</span><span class="w"> </span><span class="nc">123</span><span class="p">})</span><span class="w"> </span><span class="py">RETURN</span><span class="w"> </span><span class="py">u</span><span class="err">.</span><span class="py">balance</span><span class="err">;</span><span class="w"> </span><span class="err">--</span><span class="w"> </span><span class="py">Returns</span><span class="w"> </span><span class="nv">$100</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Transaction</span><span class="w"> </span><span class="py">2</span><span class="w"> </span><span class="p">(</span><span class="py">concurrent</span><span class="p">)</span><span class="w"> </span><span class="py">modifies</span><span class="w"> </span><span class="py">the</span><span class="w"> </span><span class="py">same</span><span class="w"> </span><span class="py">user</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Transaction</span><span class="w"> </span><span class="py">1</span><span class="w"> </span><span class="py">still</span><span class="w"> </span><span class="py">sees</span><span class="w"> </span><span class="nv">$100</span><span class="w"> </span><span class="p">(</span><span class="py">snapshot</span><span class="w"> </span><span class="py">isolation</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Transaction</span><span class="w"> </span><span class="py">1</span><span class="w"> </span><span class="py">continues</span><span class="w"> </span><span class="py">with</span><span class="w"> </span><span class="py">consistent</span><span class="w"> </span><span class="py">view</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">u</span><span class="p">:</span><span class="nc">User</span><span class="w"> </span><span class="p">{</span><span class="py">id</span><span class="p">:</span><span class="w"> </span><span class="nc">123</span><span class="p">})</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">SET</span><span class="w"> </span><span class="py">u</span><span class="err">.</span><span class="py">last_accessed</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="py">timestamp</span><span class="p">()</span><span class="err">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">COMMIT</span><span class="err">;</span><span class="w">
</span></span></span></code></pre></div>
<h4 id="serializable-snapshot-isolation-ssi" class="position-relative d-flex align-items-center group">
<span>Serializable Snapshot Isolation (SSI)</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="serializable-snapshot-isolation-ssi"
aria-haspopup="dialog"
aria-label="Share link: Serializable Snapshot Isolation (SSI)">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p>SSI prevents anomalies that can occur with basic snapshot isolation:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="err">--</span><span class="w"> </span><span class="py">Example</span><span class="p">:</span><span class="w"> </span><span class="nc">Preventing</span><span class="w"> </span><span class="py">write</span><span class="w"> </span><span class="py">skew</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Two</span><span class="w"> </span><span class="py">users</span><span class="w"> </span><span class="py">try</span><span class="w"> </span><span class="py">to</span><span class="w"> </span><span class="py">book</span><span class="w"> </span><span class="py">the</span><span class="w"> </span><span class="py">last</span><span class="w"> </span><span class="py">seat</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Transaction</span><span class="w"> </span><span class="py">1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">BEGIN</span><span class="w"> </span><span class="py">TRANSACTION</span><span class="w"> </span><span class="py">ISOLATION</span><span class="w"> </span><span class="py">LEVEL</span><span class="w"> </span><span class="py">SERIALIZABLE</span><span class="err">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">seat</span><span class="p">:</span><span class="nc">Seat</span><span class="w"> </span><span class="p">{</span><span class="py">id</span><span class="p">:</span><span class="w"> </span><span class="nc">42</span><span class="p">})</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WHERE</span><span class="w"> </span><span class="py">NOT</span><span class="w"> </span><span class="py">EXISTS</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">seat</span><span class="p">)</span><span class="err"><-</span><span class="p">[:</span><span class="nc">BOOKED</span><span class="p">]</span><span class="err">-</span><span class="p">()</span><span class="w"> </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">CREATE</span><span class="w"> </span><span class="p">(</span><span class="py">user1</span><span class="p">:</span><span class="nc">User</span><span class="w"> </span><span class="p">{</span><span class="py">id</span><span class="p">:</span><span class="w"> </span><span class="nc">1</span><span class="p">})</span><span class="err">-</span><span class="p">[:</span><span class="nc">BOOKED</span><span class="p">]</span><span class="err">-></span><span class="p">(</span><span class="py">seat</span><span class="p">)</span><span class="err">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">COMMIT</span><span class="err">;</span><span class="w"> </span><span class="err">--</span><span class="w"> </span><span class="py">Succeeds</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Transaction</span><span class="w"> </span><span class="py">2</span><span class="w"> </span><span class="p">(</span><span class="py">concurrent</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">BEGIN</span><span class="w"> </span><span class="py">TRANSACTION</span><span class="w"> </span><span class="py">ISOLATION</span><span class="w"> </span><span class="py">LEVEL</span><span class="w"> </span><span class="py">SERIALIZABLE</span><span class="err">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">seat</span><span class="p">:</span><span class="nc">Seat</span><span class="w"> </span><span class="p">{</span><span class="py">id</span><span class="p">:</span><span class="w"> </span><span class="nc">42</span><span class="p">})</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WHERE</span><span class="w"> </span><span class="py">NOT</span><span class="w"> </span><span class="py">EXISTS</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">seat</span><span class="p">)</span><span class="err"><-</span><span class="p">[:</span><span class="nc">BOOKED</span><span class="p">]</span><span class="err">-</span><span class="p">()</span><span class="w"> </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">CREATE</span><span class="w"> </span><span class="p">(</span><span class="py">user2</span><span class="p">:</span><span class="nc">User</span><span class="w"> </span><span class="p">{</span><span class="py">id</span><span class="p">:</span><span class="w"> </span><span class="nc">2</span><span class="p">})</span><span class="err">-</span><span class="p">[:</span><span class="nc">BOOKED</span><span class="p">]</span><span class="err">-></span><span class="p">(</span><span class="py">seat</span><span class="p">)</span><span class="err">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">COMMIT</span><span class="err">;</span><span class="w"> </span><span class="err">--</span><span class="w"> </span><span class="py">Fails</span><span class="w"> </span><span class="py">with</span><span class="w"> </span><span class="py">serialization</span><span class="w"> </span><span class="py">error</span><span class="w">
</span></span></span></code></pre></div><p><strong>SSI detection mechanisms</strong>:</p>
<ul>
<li><strong>Read-Write conflict detection</strong>: Tracks dependencies between transactions</li>
<li><strong>Write-Write conflict detection</strong>: Identifies concurrent modifications</li>
<li><strong>Automatic retry</strong>: Failed transactions can be retried automatically</li>
</ul>
<h3 id="isolation-levels" class="position-relative d-flex align-items-center group">
<span>Isolation Levels</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="isolation-levels"
aria-haspopup="dialog"
aria-label="Share link: Isolation Levels">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3><p>Geode supports multiple isolation levels, trading off between consistency and performance:</p>
<h4 id="read-uncommitted-rarely-used" class="position-relative d-flex align-items-center group">
<span>Read Uncommitted (Rarely Used)</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="read-uncommitted-rarely-used"
aria-haspopup="dialog"
aria-label="Share link: Read Uncommitted (Rarely Used)">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p><strong>Behavior</strong>: Can see uncommitted changes from other transactions
<strong>Use case</strong>: Approximate queries where accuracy isn’t critical</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="py">BEGIN</span><span class="w"> </span><span class="py">TRANSACTION</span><span class="w"> </span><span class="py">ISOLATION</span><span class="w"> </span><span class="py">LEVEL</span><span class="w"> </span><span class="py">READ</span><span class="w"> </span><span class="py">UNCOMMITTED</span><span class="err">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">May</span><span class="w"> </span><span class="py">see</span><span class="w"> </span><span class="py">intermediate</span><span class="w"> </span><span class="py">states</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">p</span><span class="p">:</span><span class="nc">Product</span><span class="p">)</span><span class="w"> </span><span class="py">RETURN</span><span class="w"> </span><span class="py">avg</span><span class="p">(</span><span class="py">p</span><span class="err">.</span><span class="py">price</span><span class="p">)</span><span class="err">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">COMMIT</span><span class="err">;</span><span class="w">
</span></span></span></code></pre></div>
<h4 id="read-committed-default-for-many-operations" class="position-relative d-flex align-items-center group">
<span>Read Committed (Default for Many Operations)</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="read-committed-default-for-many-operations"
aria-haspopup="dialog"
aria-label="Share link: Read Committed (Default for Many Operations)">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p><strong>Behavior</strong>: Sees only committed data, but may observe changes during transaction
<strong>Use case</strong>: Most OLTP workloads</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="py">BEGIN</span><span class="w"> </span><span class="py">TRANSACTION</span><span class="w"> </span><span class="py">ISOLATION</span><span class="w"> </span><span class="py">LEVEL</span><span class="w"> </span><span class="py">READ</span><span class="w"> </span><span class="py">COMMITTED</span><span class="err">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">u</span><span class="p">:</span><span class="nc">User</span><span class="w"> </span><span class="p">{</span><span class="py">id</span><span class="p">:</span><span class="w"> </span><span class="nv">$id</span><span class="p">})</span><span class="w"> </span><span class="nc">RETURN</span><span class="w"> </span><span class="py">u</span><span class="err">;</span><span class="w"> </span><span class="err">--</span><span class="w"> </span><span class="py">Sees</span><span class="w"> </span><span class="py">committed</span><span class="w"> </span><span class="py">state</span><span class="w"> </span><span class="py">at</span><span class="w"> </span><span class="kd">query</span><span class="w"> </span><span class="nc">time</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Another</span><span class="w"> </span><span class="py">transaction</span><span class="w"> </span><span class="py">commits</span><span class="w"> </span><span class="py">changes</span><span class="w"> </span><span class="py">to</span><span class="w"> </span><span class="py">same</span><span class="w"> </span><span class="py">user</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">u</span><span class="p">:</span><span class="nc">User</span><span class="w"> </span><span class="p">{</span><span class="py">id</span><span class="p">:</span><span class="w"> </span><span class="nv">$id</span><span class="p">})</span><span class="w"> </span><span class="nc">RETURN</span><span class="w"> </span><span class="py">u</span><span class="err">;</span><span class="w"> </span><span class="err">--</span><span class="w"> </span><span class="py">May</span><span class="w"> </span><span class="py">see</span><span class="w"> </span><span class="py">different</span><span class="w"> </span><span class="py">data</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">COMMIT</span><span class="err">;</span><span class="w">
</span></span></span></code></pre></div>
<h4 id="repeatable-read" class="position-relative d-flex align-items-center group">
<span>Repeatable Read</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="repeatable-read"
aria-haspopup="dialog"
aria-label="Share link: Repeatable Read">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p><strong>Behavior</strong>: Consistent snapshot throughout transaction
<strong>Use case</strong>: Reports, analytics requiring consistent view</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="py">BEGIN</span><span class="w"> </span><span class="py">TRANSACTION</span><span class="w"> </span><span class="py">ISOLATION</span><span class="w"> </span><span class="py">LEVEL</span><span class="w"> </span><span class="py">REPEATABLE</span><span class="w"> </span><span class="py">READ</span><span class="err">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">u</span><span class="p">:</span><span class="nc">User</span><span class="w"> </span><span class="p">{</span><span class="py">id</span><span class="p">:</span><span class="w"> </span><span class="nv">$id</span><span class="p">})</span><span class="w"> </span><span class="nc">RETURN</span><span class="w"> </span><span class="py">u</span><span class="err">;</span><span class="w"> </span><span class="err">--</span><span class="w"> </span><span class="py">Snapshot</span><span class="w"> </span><span class="py">at</span><span class="w"> </span><span class="py">transaction</span><span class="w"> </span><span class="py">start</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Other</span><span class="w"> </span><span class="py">transactions</span><span class="w"> </span><span class="py">modify</span><span class="w"> </span><span class="py">data</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">u</span><span class="p">:</span><span class="nc">User</span><span class="w"> </span><span class="p">{</span><span class="py">id</span><span class="p">:</span><span class="w"> </span><span class="nv">$id</span><span class="p">})</span><span class="w"> </span><span class="nc">RETURN</span><span class="w"> </span><span class="py">u</span><span class="err">;</span><span class="w"> </span><span class="err">--</span><span class="w"> </span><span class="py">Same</span><span class="w"> </span><span class="py">result</span><span class="w"> </span><span class="py">as</span><span class="w"> </span><span class="py">first</span><span class="w"> </span><span class="kd">query</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nc">COMMIT</span><span class="err">;</span><span class="w">
</span></span></span></code></pre></div>
<h4 id="serializable-strongest" class="position-relative d-flex align-items-center group">
<span>Serializable (Strongest)</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="serializable-strongest"
aria-haspopup="dialog"
aria-label="Share link: Serializable (Strongest)">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p><strong>Behavior</strong>: Transactions appear to execute serially
<strong>Use case</strong>: Critical operations requiring absolute consistency</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="py">BEGIN</span><span class="w"> </span><span class="py">TRANSACTION</span><span class="w"> </span><span class="py">ISOLATION</span><span class="w"> </span><span class="py">LEVEL</span><span class="w"> </span><span class="py">SERIALIZABLE</span><span class="err">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">All</span><span class="w"> </span><span class="py">operations</span><span class="w"> </span><span class="py">see</span><span class="w"> </span><span class="py">consistent</span><span class="w"> </span><span class="py">snapshot</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Write</span><span class="w"> </span><span class="py">conflicts</span><span class="w"> </span><span class="py">detected</span><span class="w"> </span><span class="py">and</span><span class="w"> </span><span class="py">transaction</span><span class="w"> </span><span class="py">may</span><span class="w"> </span><span class="py">abort</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">COMMIT</span><span class="err">;</span><span class="w">
</span></span></span></code></pre></div>
<h3 id="concurrency-patterns-and-best-practices" class="position-relative d-flex align-items-center group">
<span>Concurrency Patterns and Best Practices</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="concurrency-patterns-and-best-practices"
aria-haspopup="dialog"
aria-label="Share link: Concurrency Patterns and Best Practices">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3>
<h4 id="pattern-1-optimistic-locking-with-version-numbers" class="position-relative d-flex align-items-center group">
<span>Pattern 1: Optimistic Locking with Version Numbers</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="pattern-1-optimistic-locking-with-version-numbers"
aria-haspopup="dialog"
aria-label="Share link: Pattern 1: Optimistic Locking with Version Numbers">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p>Detect concurrent modifications using version fields:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="err">--</span><span class="w"> </span><span class="py">Read</span><span class="w"> </span><span class="py">with</span><span class="w"> </span><span class="py">version</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">account</span><span class="p">:</span><span class="nc">Account</span><span class="w"> </span><span class="p">{</span><span class="py">id</span><span class="p">:</span><span class="w"> </span><span class="nv">$account_id</span><span class="p">})</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nc">RETURN</span><span class="w"> </span><span class="py">account</span><span class="err">.</span><span class="py">balance</span><span class="p">,</span><span class="w"> </span><span class="py">account</span><span class="err">.</span><span class="py">version</span><span class="err">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Returns</span><span class="p">:</span><span class="w"> </span><span class="nc">balance</span><span class="p">=</span><span class="py">100</span><span class="p">,</span><span class="w"> </span><span class="py">version</span><span class="p">=</span><span class="py">5</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Update</span><span class="w"> </span><span class="py">with</span><span class="w"> </span><span class="py">version</span><span class="w"> </span><span class="py">check</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">account</span><span class="p">:</span><span class="nc">Account</span><span class="w"> </span><span class="p">{</span><span class="py">id</span><span class="p">:</span><span class="w"> </span><span class="nv">$account_id</span><span class="p">})</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nc">WHERE</span><span class="w"> </span><span class="py">account</span><span class="err">.</span><span class="py">version</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="nv">$expected_version</span><span class="w"> </span><span class="err">--</span><span class="w"> </span><span class="py">Check</span><span class="w"> </span><span class="py">version</span><span class="w"> </span><span class="py">hasn</span><span class="err">'</span><span class="py">t</span><span class="w"> </span><span class="py">changed</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">SET</span><span class="w"> </span><span class="py">account</span><span class="err">.</span><span class="py">balance</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="nv">$new_balance</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">account</span><span class="err">.</span><span class="py">version</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="nv">$expected_version</span><span class="w"> </span><span class="err">+</span><span class="w"> </span><span class="py">1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">account</span><span class="err">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Fails</span><span class="w"> </span><span class="py">if</span><span class="w"> </span><span class="py">another</span><span class="w"> </span><span class="py">transaction</span><span class="w"> </span><span class="py">modified</span><span class="w"> </span><span class="py">account</span><span class="w"> </span><span class="p">(</span><span class="py">version</span><span class="w"> </span><span class="py">changed</span><span class="p">)</span><span class="w">
</span></span></span></code></pre></div><p><strong>Python implementation</strong>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">geode_client</span> <span class="kn">import</span> <span class="n">Client</span><span class="p">,</span> <span class="n">ConcurrentModificationError</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">async</span> <span class="k">def</span> <span class="nf">update_account_balance</span><span class="p">(</span><span class="n">account_id</span><span class="p">,</span> <span class="n">amount</span><span class="p">):</span>
</span></span><span class="line"><span class="cl"> <span class="n">client</span> <span class="o">=</span> <span class="n">Client</span><span class="p">(</span><span class="n">host</span><span class="o">=</span><span class="s2">"localhost"</span><span class="p">,</span> <span class="n">port</span><span class="o">=</span><span class="mi">3141</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="k">async</span> <span class="k">with</span> <span class="n">client</span><span class="o">.</span><span class="n">connection</span><span class="p">()</span> <span class="k">as</span> <span class="n">conn</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="k">while</span> <span class="kc">True</span><span class="p">:</span> <span class="c1"># Retry loop</span>
</span></span><span class="line"><span class="cl"> <span class="c1"># Read current state</span>
</span></span><span class="line"><span class="cl"> <span class="n">result</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="k">await</span> <span class="n">conn</span><span class="o">.</span><span class="n">query</span><span class="p">(</span><span class="s2">"""
</span></span></span><span class="line"><span class="cl"><span class="s2"> MATCH (a:Account {id: $id})
</span></span></span><span class="line"><span class="cl"><span class="s2"> RETURN a.balance AS balance, a.version AS version
</span></span></span><span class="line"><span class="cl"><span class="s2"> """</span><span class="p">,</span> <span class="p">{</span><span class="s2">"id"</span><span class="p">:</span> <span class="n">account_id</span><span class="p">})</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="n">current_balance</span> <span class="o">=</span> <span class="n">result</span><span class="o">.</span><span class="n">bindings</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="s1">'balance'</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"> <span class="n">current_version</span> <span class="o">=</span> <span class="n">result</span><span class="o">.</span><span class="n">bindings</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="s1">'version'</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="c1"># Attempt update with version check</span>
</span></span><span class="line"><span class="cl"> <span class="k">try</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="k">await</span> <span class="n">conn</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">"""
</span></span></span><span class="line"><span class="cl"><span class="s2"> MATCH (a:Account {id: $id})
</span></span></span><span class="line"><span class="cl"><span class="s2"> WHERE a.version = $version
</span></span></span><span class="line"><span class="cl"><span class="s2"> SET a.balance = $new_balance,
</span></span></span><span class="line"><span class="cl"><span class="s2"> a.version = $version + 1
</span></span></span><span class="line"><span class="cl"><span class="s2"> """</span><span class="p">,</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"id"</span><span class="p">:</span> <span class="n">account_id</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"version"</span><span class="p">:</span> <span class="n">current_version</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"new_balance"</span><span class="p">:</span> <span class="n">current_balance</span> <span class="o">+</span> <span class="n">amount</span>
</span></span><span class="line"><span class="cl"> <span class="p">})</span>
</span></span><span class="line"><span class="cl"> <span class="k">break</span> <span class="c1"># Success</span>
</span></span><span class="line"><span class="cl"> <span class="k">except</span> <span class="n">ConcurrentModificationError</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="c1"># Another transaction modified it, retry</span>
</span></span><span class="line"><span class="cl"> <span class="k">await</span> <span class="n">asyncio</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="mf">0.01</span><span class="p">)</span> <span class="c1"># Brief backoff</span>
</span></span></code></pre></div>
<h4 id="pattern-2-atomic-operations" class="position-relative d-flex align-items-center group">
<span>Pattern 2: Atomic Operations</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="pattern-2-atomic-operations"
aria-haspopup="dialog"
aria-label="Share link: Pattern 2: Atomic Operations">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p>Use atomic modifications to avoid read-modify-write races:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="err">--</span><span class="w"> </span><span class="py">WRONG</span><span class="p">:</span><span class="w"> </span><span class="nc">Read</span><span class="err">-</span><span class="py">modify</span><span class="err">-</span><span class="py">write</span><span class="w"> </span><span class="p">(</span><span class="py">not</span><span class="w"> </span><span class="py">atomic</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">counter</span><span class="p">:</span><span class="nc">Counter</span><span class="w"> </span><span class="p">{</span><span class="py">name</span><span class="p">:</span><span class="w"> </span><span class="err">'</span><span class="nc">page_views</span><span class="err">'</span><span class="p">})</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WITH</span><span class="w"> </span><span class="py">counter</span><span class="err">.</span><span class="py">value</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">current</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">counter</span><span class="p">:</span><span class="nc">Counter</span><span class="w"> </span><span class="p">{</span><span class="py">name</span><span class="p">:</span><span class="w"> </span><span class="err">'</span><span class="nc">page_views</span><span class="err">'</span><span class="p">})</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">SET</span><span class="w"> </span><span class="py">counter</span><span class="err">.</span><span class="py">value</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="py">current</span><span class="w"> </span><span class="err">+</span><span class="w"> </span><span class="py">1</span><span class="err">;</span><span class="w"> </span><span class="err">--</span><span class="w"> </span><span class="py">Race</span><span class="w"> </span><span class="py">condition</span><span class="p">!</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">RIGHT</span><span class="p">:</span><span class="w"> </span><span class="nc">Atomic</span><span class="w"> </span><span class="py">increment</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">counter</span><span class="p">:</span><span class="nc">Counter</span><span class="w"> </span><span class="p">{</span><span class="py">name</span><span class="p">:</span><span class="w"> </span><span class="err">'</span><span class="nc">page_views</span><span class="err">'</span><span class="p">})</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">SET</span><span class="w"> </span><span class="py">counter</span><span class="err">.</span><span class="py">value</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="py">counter</span><span class="err">.</span><span class="py">value</span><span class="w"> </span><span class="err">+</span><span class="w"> </span><span class="py">1</span><span class="err">;</span><span class="w"> </span><span class="err">--</span><span class="w"> </span><span class="py">Atomic</span><span class="w"> </span><span class="py">operation</span><span class="w">
</span></span></span></code></pre></div>
<h4 id="pattern-3-batch-processing-with-transactions" class="position-relative d-flex align-items-center group">
<span>Pattern 3: Batch Processing with Transactions</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="pattern-3-batch-processing-with-transactions"
aria-haspopup="dialog"
aria-label="Share link: Pattern 3: Batch Processing with Transactions">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p>Group operations to reduce transaction overhead:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="k">async</span> <span class="k">def</span> <span class="nf">process_orders_batch</span><span class="p">(</span><span class="n">orders</span><span class="p">):</span>
</span></span><span class="line"><span class="cl"> <span class="n">client</span> <span class="o">=</span> <span class="n">Client</span><span class="p">(</span><span class="n">host</span><span class="o">=</span><span class="s2">"localhost"</span><span class="p">,</span> <span class="n">port</span><span class="o">=</span><span class="mi">3141</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="k">async</span> <span class="k">with</span> <span class="n">client</span><span class="o">.</span><span class="n">connection</span><span class="p">()</span> <span class="k">as</span> <span class="n">conn</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="c1"># Isolation is configured server-side</span>
</span></span><span class="line"><span class="cl"> <span class="k">await</span> <span class="n">conn</span><span class="o">.</span><span class="n">begin</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"> <span class="k">try</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="k">for</span> <span class="n">order</span> <span class="ow">in</span> <span class="n">orders</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="k">await</span> <span class="n">conn</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"""
</span></span></span><span class="line"><span class="cl"><span class="s2"> MATCH (p:Product {id: $product_id})
</span></span></span><span class="line"><span class="cl"><span class="s2"> WHERE p.stock >= $quantity
</span></span></span><span class="line"><span class="cl"><span class="s2"> SET p.stock = p.stock - $quantity
</span></span></span><span class="line"><span class="cl"><span class="s2"> CREATE (order:Order {
</span></span></span><span class="line"><span class="cl"><span class="s2"> id: $order_id,
</span></span></span><span class="line"><span class="cl"><span class="s2"> product_id: $product_id,
</span></span></span><span class="line"><span class="cl"><span class="s2"> quantity: $quantity,
</span></span></span><span class="line"><span class="cl"><span class="s2"> timestamp: timestamp()
</span></span></span><span class="line"><span class="cl"><span class="s2"> })
</span></span></span><span class="line"><span class="cl"><span class="s2"> """</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"product_id"</span><span class="p">:</span> <span class="n">order</span><span class="o">.</span><span class="n">product_id</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"quantity"</span><span class="p">:</span> <span class="n">order</span><span class="o">.</span><span class="n">quantity</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"order_id"</span><span class="p">:</span> <span class="n">order</span><span class="o">.</span><span class="n">id</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="p">},</span>
</span></span><span class="line"><span class="cl"> <span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="k">await</span> <span class="n">conn</span><span class="o">.</span><span class="n">commit</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"> <span class="k">except</span> <span class="ne">Exception</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="k">await</span> <span class="n">conn</span><span class="o">.</span><span class="n">rollback</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"> <span class="k">raise</span>
</span></span></code></pre></div>
<h4 id="pattern-4-pessimistic-locking-when-necessary" class="position-relative d-flex align-items-center group">
<span>Pattern 4: Pessimistic Locking When Necessary</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="pattern-4-pessimistic-locking-when-necessary"
aria-haspopup="dialog"
aria-label="Share link: Pattern 4: Pessimistic Locking When Necessary">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p>For critical sections requiring exclusive access:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="err">--</span><span class="w"> </span><span class="py">Explicit</span><span class="w"> </span><span class="py">locking</span><span class="w"> </span><span class="p">(</span><span class="py">use</span><span class="w"> </span><span class="py">sparingly</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">BEGIN</span><span class="w"> </span><span class="py">TRANSACTION</span><span class="err">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">resource</span><span class="p">:</span><span class="nc">Resource</span><span class="w"> </span><span class="p">{</span><span class="py">id</span><span class="p">:</span><span class="w"> </span><span class="nv">$id</span><span class="p">})</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nc">SET</span><span class="w"> </span><span class="py">resource</span><span class="err">.</span><span class="py">locked</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="py">true</span><span class="err">;</span><span class="w"> </span><span class="err">--</span><span class="w"> </span><span class="py">Application</span><span class="err">-</span><span class="py">level</span><span class="w"> </span><span class="py">lock</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Perform</span><span class="w"> </span><span class="py">critical</span><span class="w"> </span><span class="py">operations</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">resource</span><span class="p">:</span><span class="nc">Resource</span><span class="w"> </span><span class="p">{</span><span class="py">id</span><span class="p">:</span><span class="w"> </span><span class="nv">$id</span><span class="p">})</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nc">WHERE</span><span class="w"> </span><span class="py">resource</span><span class="err">.</span><span class="py">locked</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="py">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">SET</span><span class="w"> </span><span class="py">resource</span><span class="err">.</span><span class="py">state</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="err">'</span><span class="py">processing</span><span class="err">';</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Release</span><span class="w"> </span><span class="py">lock</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">resource</span><span class="p">:</span><span class="nc">Resource</span><span class="w"> </span><span class="p">{</span><span class="py">id</span><span class="p">:</span><span class="w"> </span><span class="nv">$id</span><span class="p">})</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nc">SET</span><span class="w"> </span><span class="py">resource</span><span class="err">.</span><span class="py">locked</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="py">false</span><span class="err">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">COMMIT</span><span class="err">;</span><span class="w">
</span></span></span></code></pre></div>
<h3 id="handling-deadlocks" class="position-relative d-flex align-items-center group">
<span>Handling Deadlocks</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="handling-deadlocks"
aria-haspopup="dialog"
aria-label="Share link: Handling Deadlocks">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3><p>Deadlocks occur when transactions wait for each other circularly:</p>
<p><strong>Example scenario</strong>:</p>
<ul>
<li>Transaction A locks Node 1, waits for Node 2</li>
<li>Transaction B locks Node 2, waits for Node 1</li>
<li>Neither can proceed (deadlock)</li>
</ul>
<p><strong>Geode’s deadlock prevention</strong>:</p>
<ol>
<li><strong>Timeout-based detection</strong>: Transactions timeout after configurable period</li>
<li><strong>Automatic rollback</strong>: One transaction is chosen as victim and rolled back</li>
<li><strong>Retry hints</strong>: Client receives error indicating retry-able failure</li>
</ol>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">geode_client</span> <span class="kn">import</span> <span class="n">QueryError</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">async</span> <span class="k">def</span> <span class="nf">transfer_funds_with_retry</span><span class="p">(</span><span class="n">from_account</span><span class="p">,</span> <span class="n">to_account</span><span class="p">,</span> <span class="n">amount</span><span class="p">,</span> <span class="n">max_retries</span><span class="o">=</span><span class="mi">3</span><span class="p">):</span>
</span></span><span class="line"><span class="cl"> <span class="k">for</span> <span class="n">attempt</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">max_retries</span><span class="p">):</span>
</span></span><span class="line"><span class="cl"> <span class="k">try</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="n">client</span> <span class="o">=</span> <span class="n">Client</span><span class="p">(</span><span class="n">host</span><span class="o">=</span><span class="s2">"localhost"</span><span class="p">,</span> <span class="n">port</span><span class="o">=</span><span class="mi">3141</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="k">async</span> <span class="k">with</span> <span class="n">client</span><span class="o">.</span><span class="n">connection</span><span class="p">()</span> <span class="k">as</span> <span class="n">conn</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="c1"># Isolation is configured server-side</span>
</span></span><span class="line"><span class="cl"> <span class="k">await</span> <span class="n">conn</span><span class="o">.</span><span class="n">begin</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"> <span class="k">try</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="c1"># Debit from account</span>
</span></span><span class="line"><span class="cl"> <span class="k">await</span> <span class="n">conn</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"""
</span></span></span><span class="line"><span class="cl"><span class="s2"> MATCH (a:Account {id: $id})
</span></span></span><span class="line"><span class="cl"><span class="s2"> WHERE a.balance >= $amount
</span></span></span><span class="line"><span class="cl"><span class="s2"> SET a.balance = a.balance - $amount
</span></span></span><span class="line"><span class="cl"><span class="s2"> """</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="p">{</span><span class="s2">"id"</span><span class="p">:</span> <span class="n">from_account</span><span class="p">,</span> <span class="s2">"amount"</span><span class="p">:</span> <span class="n">amount</span><span class="p">},</span>
</span></span><span class="line"><span class="cl"> <span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="c1"># Credit to account</span>
</span></span><span class="line"><span class="cl"> <span class="k">await</span> <span class="n">conn</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"""
</span></span></span><span class="line"><span class="cl"><span class="s2"> MATCH (a:Account {id: $id})
</span></span></span><span class="line"><span class="cl"><span class="s2"> SET a.balance = a.balance + $amount
</span></span></span><span class="line"><span class="cl"><span class="s2"> """</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="p">{</span><span class="s2">"id"</span><span class="p">:</span> <span class="n">to_account</span><span class="p">,</span> <span class="s2">"amount"</span><span class="p">:</span> <span class="n">amount</span><span class="p">},</span>
</span></span><span class="line"><span class="cl"> <span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="k">await</span> <span class="n">conn</span><span class="o">.</span><span class="n">commit</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"> <span class="k">except</span> <span class="n">QueryError</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="k">await</span> <span class="n">conn</span><span class="o">.</span><span class="n">rollback</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"> <span class="k">raise</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="c1"># Success</span>
</span></span><span class="line"><span class="cl"> <span class="k">except</span> <span class="n">QueryError</span> <span class="k">as</span> <span class="n">exc</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="k">if</span> <span class="s2">"DEADLOCK"</span> <span class="ow">not</span> <span class="ow">in</span> <span class="nb">str</span><span class="p">(</span><span class="n">exc</span><span class="p">):</span>
</span></span><span class="line"><span class="cl"> <span class="k">raise</span>
</span></span><span class="line"><span class="cl"> <span class="k">if</span> <span class="n">attempt</span> <span class="o">==</span> <span class="n">max_retries</span> <span class="o">-</span> <span class="mi">1</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="k">raise</span> <span class="c1"># Final attempt failed</span>
</span></span><span class="line"><span class="cl"> <span class="k">await</span> <span class="n">asyncio</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="mf">0.1</span> <span class="o">*</span> <span class="p">(</span><span class="n">attempt</span> <span class="o">+</span> <span class="mi">1</span><span class="p">))</span> <span class="c1"># Exponential backoff</span>
</span></span></code></pre></div><p><strong>Deadlock avoidance strategies</strong>:</p>
<ol>
<li><strong>Consistent ordering</strong>: Always access resources in same order</li>
<li><strong>Short transactions</strong>: Minimize lock hold time</li>
<li><strong>Coarse-grained locking</strong>: Lock at higher level to reduce conflicts</li>
<li><strong>Retry logic</strong>: Implement exponential backoff</li>
</ol>
<h3 id="connection-pool-management" class="position-relative d-flex align-items-center group">
<span>Connection Pool Management</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="connection-pool-management"
aria-haspopup="dialog"
aria-label="Share link: Connection Pool Management">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3><p>Connection pooling critical for concurrent access patterns:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">geode_client</span> <span class="kn">import</span> <span class="n">ConnectionPool</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Configure pool for high concurrency</span>
</span></span><span class="line"><span class="cl"><span class="n">pool</span> <span class="o">=</span> <span class="n">ConnectionPool</span><span class="p">(</span>
</span></span><span class="line"><span class="cl"> <span class="n">host</span><span class="o">=</span><span class="s2">"localhost"</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="n">port</span><span class="o">=</span><span class="mi">3141</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="n">min_connections</span><span class="o">=</span><span class="mi">10</span><span class="p">,</span> <span class="c1"># Always maintain 10 connections</span>
</span></span><span class="line"><span class="cl"> <span class="n">max_connections</span><span class="o">=</span><span class="mi">100</span><span class="p">,</span> <span class="c1"># Scale up to 100 under load</span>
</span></span><span class="line"><span class="cl"> <span class="n">max_idle_time</span><span class="o">=</span><span class="mi">300</span><span class="p">,</span> <span class="c1"># Close idle connections after 5 minutes</span>
</span></span><span class="line"><span class="cl"> <span class="n">connection_timeout</span><span class="o">=</span><span class="mi">10</span><span class="p">,</span> <span class="c1"># Fail fast if pool exhausted</span>
</span></span><span class="line"><span class="cl"> <span class="n">retry_on_timeout</span><span class="o">=</span><span class="kc">True</span> <span class="c1"># Retry if connection temporarily unavailable</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Concurrent query execution</span>
</span></span><span class="line"><span class="cl"><span class="k">async</span> <span class="k">def</span> <span class="nf">concurrent_queries</span><span class="p">(</span><span class="n">user_ids</span><span class="p">):</span>
</span></span><span class="line"><span class="cl"> <span class="n">tasks</span> <span class="o">=</span> <span class="p">[]</span>
</span></span><span class="line"><span class="cl"> <span class="k">for</span> <span class="n">user_id</span> <span class="ow">in</span> <span class="n">user_ids</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="n">tasks</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">query_user</span><span class="p">(</span><span class="n">user_id</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="c1"># Execute concurrently (pool manages connection allocation)</span>
</span></span><span class="line"><span class="cl"> <span class="n">results</span> <span class="o">=</span> <span class="k">await</span> <span class="n">asyncio</span><span class="o">.</span><span class="n">gather</span><span class="p">(</span><span class="o">*</span><span class="n">tasks</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="n">results</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">async</span> <span class="k">def</span> <span class="nf">query_user</span><span class="p">(</span><span class="n">user_id</span><span class="p">):</span>
</span></span><span class="line"><span class="cl"> <span class="k">async</span> <span class="k">with</span> <span class="n">pool</span><span class="o">.</span><span class="n">acquire</span><span class="p">()</span> <span class="k">as</span> <span class="n">client</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="n">result</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="k">await</span> <span class="n">client</span><span class="o">.</span><span class="n">query</span><span class="p">(</span><span class="s2">"""
</span></span></span><span class="line"><span class="cl"><span class="s2"> MATCH (u:User {id: $id})
</span></span></span><span class="line"><span class="cl"><span class="s2"> RETURN u
</span></span></span><span class="line"><span class="cl"><span class="s2"> """</span><span class="p">,</span> <span class="p">{</span><span class="s2">"id"</span><span class="p">:</span> <span class="n">user_id</span><span class="p">})</span>
</span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="n">result</span><span class="o">.</span><span class="n">bindings</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
</span></span></code></pre></div>
<h3 id="performance-considerations" class="position-relative d-flex align-items-center group">
<span>Performance Considerations</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="performance-considerations"
aria-haspopup="dialog"
aria-label="Share link: Performance Considerations">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3>
<h4 id="read-heavy-workloads" class="position-relative d-flex align-items-center group">
<span>Read-Heavy Workloads</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="read-heavy-workloads"
aria-haspopup="dialog"
aria-label="Share link: Read-Heavy Workloads">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p>MVCC excels for read-heavy patterns:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="c1"># Efficient concurrent reads (no locking)</span>
</span></span><span class="line"><span class="cl"><span class="k">async</span> <span class="k">def</span> <span class="nf">analytics_query</span><span class="p">():</span>
</span></span><span class="line"><span class="cl"> <span class="n">client</span> <span class="o">=</span> <span class="n">Client</span><span class="p">(</span><span class="n">host</span><span class="o">=</span><span class="s2">"localhost"</span><span class="p">,</span> <span class="n">port</span><span class="o">=</span><span class="mi">3141</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="k">async</span> <span class="k">with</span> <span class="n">client</span><span class="o">.</span><span class="n">connection</span><span class="p">()</span> <span class="k">as</span> <span class="n">conn</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="c1"># Large analytical query doesn't block writes</span>
</span></span><span class="line"><span class="cl"> <span class="n">result</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="k">await</span> <span class="n">conn</span><span class="o">.</span><span class="n">query</span><span class="p">(</span><span class="s2">"""
</span></span></span><span class="line"><span class="cl"><span class="s2"> MATCH (u:User)-[:PURCHASED]->(p:Product)
</span></span></span><span class="line"><span class="cl"><span class="s2"> RETURN p.category, count(u) AS buyers
</span></span></span><span class="line"><span class="cl"><span class="s2"> ORDER BY buyers DESC
</span></span></span><span class="line"><span class="cl"><span class="s2"> """</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="n">result</span><span class="o">.</span><span class="n">bindings</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Concurrent writes continue unblocked</span>
</span></span><span class="line"><span class="cl"><span class="k">async</span> <span class="k">def</span> <span class="nf">record_purchase</span><span class="p">(</span><span class="n">user_id</span><span class="p">,</span> <span class="n">product_id</span><span class="p">):</span>
</span></span><span class="line"><span class="cl"> <span class="n">client</span> <span class="o">=</span> <span class="n">Client</span><span class="p">(</span><span class="n">host</span><span class="o">=</span><span class="s2">"localhost"</span><span class="p">,</span> <span class="n">port</span><span class="o">=</span><span class="mi">3141</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="k">async</span> <span class="k">with</span> <span class="n">client</span><span class="o">.</span><span class="n">connection</span><span class="p">()</span> <span class="k">as</span> <span class="n">conn</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="k">await</span> <span class="n">conn</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">"""
</span></span></span><span class="line"><span class="cl"><span class="s2"> MATCH (u:User {id: $user_id}), (p:Product {id: $product_id})
</span></span></span><span class="line"><span class="cl"><span class="s2"> CREATE (u)-[:PURCHASED {timestamp: timestamp()}]->(p)
</span></span></span><span class="line"><span class="cl"><span class="s2"> """</span><span class="p">,</span> <span class="p">{</span><span class="s2">"user_id"</span><span class="p">:</span> <span class="n">user_id</span><span class="p">,</span> <span class="s2">"product_id"</span><span class="p">:</span> <span class="n">product_id</span><span class="p">})</span>
</span></span></code></pre></div>
<h4 id="write-heavy-workloads" class="position-relative d-flex align-items-center group">
<span>Write-Heavy Workloads</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="write-heavy-workloads"
aria-haspopup="dialog"
aria-label="Share link: Write-Heavy Workloads">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p>For write-heavy scenarios, minimize contention:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="c1"># GOOD: Partition writes to reduce conflicts</span>
</span></span><span class="line"><span class="cl"><span class="k">async</span> <span class="k">def</span> <span class="nf">record_page_view</span><span class="p">(</span><span class="n">page_id</span><span class="p">,</span> <span class="n">user_id</span><span class="p">):</span>
</span></span><span class="line"><span class="cl"> <span class="c1"># Use time-based partitioning</span>
</span></span><span class="line"><span class="cl"> <span class="n">partition_key</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="n">page_id</span><span class="si">}</span><span class="s2">_</span><span class="si">{</span><span class="n">datetime</span><span class="o">.</span><span class="n">now</span><span class="p">()</span><span class="o">.</span><span class="n">hour</span><span class="si">}</span><span class="s2">"</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="n">client</span> <span class="o">=</span> <span class="n">Client</span><span class="p">(</span><span class="n">host</span><span class="o">=</span><span class="s2">"localhost"</span><span class="p">,</span> <span class="n">port</span><span class="o">=</span><span class="mi">3141</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="k">async</span> <span class="k">with</span> <span class="n">client</span><span class="o">.</span><span class="n">connection</span><span class="p">()</span> <span class="k">as</span> <span class="n">conn</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="k">await</span> <span class="n">conn</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">"""
</span></span></span><span class="line"><span class="cl"><span class="s2"> MERGE (counter:PageViewCounter {key: $key})
</span></span></span><span class="line"><span class="cl"><span class="s2"> ON CREATE SET counter.views = 1
</span></span></span><span class="line"><span class="cl"><span class="s2"> ON MATCH SET counter.views = counter.views + 1
</span></span></span><span class="line"><span class="cl"><span class="s2"> """</span><span class="p">,</span> <span class="p">{</span><span class="s2">"key"</span><span class="p">:</span> <span class="n">partition_key</span><span class="p">})</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># BAD: Single hot counter (high contention)</span>
</span></span><span class="line"><span class="cl"><span class="k">async</span> <span class="k">def</span> <span class="nf">record_page_view_bad</span><span class="p">(</span><span class="n">page_id</span><span class="p">):</span>
</span></span><span class="line"><span class="cl"> <span class="n">client</span> <span class="o">=</span> <span class="n">Client</span><span class="p">(</span><span class="n">host</span><span class="o">=</span><span class="s2">"localhost"</span><span class="p">,</span> <span class="n">port</span><span class="o">=</span><span class="mi">3141</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="k">async</span> <span class="k">with</span> <span class="n">client</span><span class="o">.</span><span class="n">connection</span><span class="p">()</span> <span class="k">as</span> <span class="n">conn</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="k">await</span> <span class="n">conn</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">"""
</span></span></span><span class="line"><span class="cl"><span class="s2"> MATCH (page:Page {id: $id})
</span></span></span><span class="line"><span class="cl"><span class="s2"> SET page.view_count = page.view_count + 1
</span></span></span><span class="line"><span class="cl"><span class="s2"> """</span><span class="p">,</span> <span class="p">{</span><span class="s2">"id"</span><span class="p">:</span> <span class="n">page_id</span><span class="p">})</span>
</span></span></code></pre></div>
<h3 id="troubleshooting-concurrency-issues" class="position-relative d-flex align-items-center group">
<span>Troubleshooting Concurrency Issues</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="troubleshooting-concurrency-issues"
aria-haspopup="dialog"
aria-label="Share link: Troubleshooting Concurrency Issues">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3>
<h4 id="symptom-high-transaction-abort-rate" class="position-relative d-flex align-items-center group">
<span>Symptom: High Transaction Abort Rate</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="symptom-high-transaction-abort-rate"
aria-haspopup="dialog"
aria-label="Share link: Symptom: High Transaction Abort Rate">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p><strong>Diagnosis</strong>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="err">--</span><span class="w"> </span><span class="py">Check</span><span class="w"> </span><span class="py">transaction</span><span class="w"> </span><span class="py">statistics</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">SHOW</span><span class="w"> </span><span class="py">STATUS</span><span class="w"> </span><span class="py">LIKE</span><span class="w"> </span><span class="err">'</span><span class="py">transaction_</span><span class="err">%';</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Look</span><span class="w"> </span><span class="py">for</span><span class="p">:</span><span class="w"> </span><span class="nc">transaction_aborts</span><span class="p">,</span><span class="w"> </span><span class="py">transaction_conflicts</span><span class="w">
</span></span></span></code></pre></div><p><strong>Solutions</strong>:</p>
<ol>
<li>Lower isolation level if consistency requirements permit</li>
<li>Reduce transaction scope (fewer operations per transaction)</li>
<li>Implement retry logic with exponential backoff</li>
<li>Redesign schema to reduce hot spots</li>
</ol>
<h4 id="symptom-slow-query-performance-under-load" class="position-relative d-flex align-items-center group">
<span>Symptom: Slow Query Performance Under Load</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="symptom-slow-query-performance-under-load"
aria-haspopup="dialog"
aria-label="Share link: Symptom: Slow Query Performance Under Load">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p><strong>Diagnosis</strong>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="c1"># Monitor connection pool metrics</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Active connections: </span><span class="si">{</span><span class="n">pool</span><span class="o">.</span><span class="n">active_connections</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Idle connections: </span><span class="si">{</span><span class="n">pool</span><span class="o">.</span><span class="n">idle_connections</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Wait time: </span><span class="si">{</span><span class="n">pool</span><span class="o">.</span><span class="n">average_wait_time</span><span class="si">}</span><span class="s2">ms"</span><span class="p">)</span>
</span></span></code></pre></div><p><strong>Solutions</strong>:</p>
<ol>
<li>Increase connection pool size</li>
<li>Optimize queries to reduce execution time</li>
<li>Add read replicas for read-heavy workloads</li>
<li>Implement caching for frequently accessed data</li>
</ol>
<h4 id="symptom-deadlock-errors" class="position-relative d-flex align-items-center group">
<span>Symptom: Deadlock Errors</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="symptom-deadlock-errors"
aria-haspopup="dialog"
aria-label="Share link: Symptom: Deadlock Errors">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p><strong>Diagnosis</strong>: Check error logs for deadlock cycles</p>
<p><strong>Solutions</strong>:</p>
<ol>
<li>Ensure consistent resource access ordering</li>
<li>Break long transactions into smaller ones</li>
<li>Add retry logic with backoff</li>
<li>Consider application-level coordination</li>
</ol>
<h3 id="related-topics" class="position-relative d-flex align-items-center group">
<span>Related Topics</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="related-topics"
aria-haspopup="dialog"
aria-label="Share link: Related Topics">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3><ul>
<li><strong><a
href="/tags/mvcc/"
>MVCC</a>
</strong>: Multi-Version Concurrency Control details</li>
<li><strong><a
href="/tags/ssi/"
>SSI</a>
</strong>: Serializable Snapshot Isolation deep dive</li>
<li><strong><a
href="/tags/transactions/"
>Transactions</a>
</strong>: Transaction management</li>
<li><strong><a
href="/tags/isolation/"
>Isolation</a>
</strong>: Isolation levels explained</li>
<li><strong><a
href="/tags/performance/"
>Performance</a>
</strong>: Performance optimization</li>
<li><strong><a
href="/tags/connections/"
>Connections</a>
</strong>: Connection management</li>
</ul>
<h3 id="advanced-concurrency-techniques" class="position-relative d-flex align-items-center group">
<span>Advanced Concurrency Techniques</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="advanced-concurrency-techniques"
aria-haspopup="dialog"
aria-label="Share link: Advanced Concurrency Techniques">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3>
<h4 id="lock-free-data-structures" class="position-relative d-flex align-items-center group">
<span>Lock-Free Data Structures</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="lock-free-data-structures"
aria-haspopup="dialog"
aria-label="Share link: Lock-Free Data Structures">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p>Geode uses lock-free algorithms internally for maximum concurrency:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">Compare-and-Swap (CAS) Operations:
</span></span><span class="line"><span class="cl">1. Read current value
</span></span><span class="line"><span class="cl">2. Compute new value
</span></span><span class="line"><span class="cl">3. Atomically update if value unchanged
</span></span><span class="line"><span class="cl">4. Retry if value changed (optimistic)
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Example: Lock-free counter increment
</span></span><span class="line"><span class="cl">do {
</span></span><span class="line"><span class="cl"> old_value = counter.read()
</span></span><span class="line"><span class="cl"> new_value = old_value + 1
</span></span><span class="line"><span class="cl">} while (!counter.compare_and_swap(old_value, new_value))
</span></span></code></pre></div><p>Benefits:</p>
<ul>
<li>No thread blocking</li>
<li>Progress guarantee (wait-free or lock-free)</li>
<li>Better CPU cache utilization</li>
<li>Higher throughput under contention</li>
</ul>
<h4 id="multi-version-read-consistency" class="position-relative d-flex align-items-center group">
<span>Multi-Version Read Consistency</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="multi-version-read-consistency"
aria-haspopup="dialog"
aria-label="Share link: Multi-Version Read Consistency">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p>MVCC provides snapshot isolation by maintaining version chains:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">Node ID: 123
</span></span><span class="line"><span class="cl">Version Chain:
</span></span><span class="line"><span class="cl"> [v5] name='Alice' age=35 txn=550 valid_from=LSN_550 valid_to=∞
</span></span><span class="line"><span class="cl"> [v4] name='Alice' age=34 txn=510 valid_from=LSN_510 valid_to=LSN_550
</span></span><span class="line"><span class="cl"> [v3] name='Alice' age=33 txn=480 valid_from=LSN_480 valid_to=LSN_510
</span></span><span class="line"><span class="cl"> [v2] name='Alice' age=32 txn=450 valid_from=LSN_450 valid_to=LSN_480
</span></span><span class="line"><span class="cl"> [v1] name='Alice' age=30 txn=420 valid_from=LSN_420 valid_to=LSN_450
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Transaction at LSN_500 sees version v3 (age=33)
</span></span><span class="line"><span class="cl">Transaction at LSN_540 sees version v4 (age=34)
</span></span></code></pre></div><p>Garbage collection removes old versions when no transactions need them.</p>
<h4 id="write-skew-prevention" class="position-relative d-flex align-items-center group">
<span>Write Skew Prevention</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="write-skew-prevention"
aria-haspopup="dialog"
aria-label="Share link: Write Skew Prevention">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p>Serializable isolation prevents write skew anomalies:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="c1"># Classic write skew example: on-call doctors</span>
</span></span><span class="line"><span class="cl"><span class="k">async</span> <span class="k">def</span> <span class="nf">assign_on_call_shift</span><span class="p">(</span><span class="n">client</span><span class="p">,</span> <span class="n">doctor_id</span><span class="p">):</span>
</span></span><span class="line"><span class="cl"> <span class="k">async</span> <span class="k">with</span> <span class="n">client</span><span class="o">.</span><span class="n">connection</span><span class="p">()</span> <span class="k">as</span> <span class="n">conn</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="c1"># Isolation is configured server-side</span>
</span></span><span class="line"><span class="cl"> <span class="k">await</span> <span class="n">conn</span><span class="o">.</span><span class="n">begin</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"> <span class="k">try</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="c1"># Check if at least one doctor will remain on call</span>
</span></span><span class="line"><span class="cl"> <span class="n">result</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="k">await</span> <span class="n">conn</span><span class="o">.</span><span class="n">query</span><span class="p">(</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"""
</span></span></span><span class="line"><span class="cl"><span class="s2"> MATCH (d:Doctor {on_call: true})
</span></span></span><span class="line"><span class="cl"><span class="s2"> WHERE d.id != $doctor_id
</span></span></span><span class="line"><span class="cl"><span class="s2"> RETURN COUNT(d) AS on_call_count
</span></span></span><span class="line"><span class="cl"><span class="s2"> """</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="p">{</span><span class="s2">"doctor_id"</span><span class="p">:</span> <span class="n">doctor_id</span><span class="p">},</span>
</span></span><span class="line"><span class="cl"> <span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="n">on_call_count</span> <span class="o">=</span> <span class="n">result</span><span class="o">.</span><span class="n">rows</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="s2">"on_call_count"</span><span class="p">]</span><span class="o">.</span><span class="n">as_int</span> <span class="k">if</span> <span class="n">result</span><span class="o">.</span><span class="n">rows</span> <span class="k">else</span> <span class="mi">0</span>
</span></span><span class="line"><span class="cl"> <span class="k">if</span> <span class="n">on_call_count</span> <span class="o">>=</span> <span class="mi">1</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="c1"># Safe to go off call</span>
</span></span><span class="line"><span class="cl"> <span class="k">await</span> <span class="n">conn</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"""
</span></span></span><span class="line"><span class="cl"><span class="s2"> MATCH (d:Doctor {id: $doctor_id})
</span></span></span><span class="line"><span class="cl"><span class="s2"> SET d.on_call = false
</span></span></span><span class="line"><span class="cl"><span class="s2"> """</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="p">{</span><span class="s2">"doctor_id"</span><span class="p">:</span> <span class="n">doctor_id</span><span class="p">},</span>
</span></span><span class="line"><span class="cl"> <span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="k">await</span> <span class="n">conn</span><span class="o">.</span><span class="n">commit</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"> <span class="k">else</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="k">await</span> <span class="n">conn</span><span class="o">.</span><span class="n">rollback</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"> <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s2">"Cannot go off call - no other doctors available"</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="k">except</span> <span class="ne">Exception</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="k">await</span> <span class="n">conn</span><span class="o">.</span><span class="n">rollback</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"> <span class="k">raise</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Without SERIALIZABLE, two doctors could simultaneously check and both go off call</span>
</span></span><span class="line"><span class="cl"><span class="c1"># With SERIALIZABLE, one transaction aborts with serialization error</span>
</span></span></code></pre></div>
<h4 id="timestamp-ordering" class="position-relative d-flex align-items-center group">
<span>Timestamp Ordering</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="timestamp-ordering"
aria-haspopup="dialog"
aria-label="Share link: Timestamp Ordering">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p>Geode uses hybrid logical clocks for timestamp ordering:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">Hybrid Logical Clock (HLC):
</span></span><span class="line"><span class="cl"> physical_time: System wall clock (64-bit microseconds)
</span></span><span class="line"><span class="cl"> logical_counter: Incrementing counter for same physical time
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Transaction Ordering:
</span></span><span class="line"><span class="cl"> T1: HLC = (1706097600000000, 0)
</span></span><span class="line"><span class="cl"> T2: HLC = (1706097600000000, 1) # Same physical time, later logical
</span></span><span class="line"><span class="cl"> T3: HLC = (1706097600000001, 0) # Later physical time
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Total Order: T1 < T2 < T3
</span></span></code></pre></div><p>This provides:</p>
<ul>
<li>Global transaction ordering</li>
<li>Causality tracking</li>
<li>Clock skew tolerance</li>
</ul>
<h3 id="real-world-concurrency-patterns" class="position-relative d-flex align-items-center group">
<span>Real-World Concurrency Patterns</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="real-world-concurrency-patterns"
aria-haspopup="dialog"
aria-label="Share link: Real-World Concurrency Patterns">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3>
<h4 id="high-frequency-trading-system" class="position-relative d-flex align-items-center group">
<span>High-Frequency Trading System</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="high-frequency-trading-system"
aria-haspopup="dialog"
aria-label="Share link: High-Frequency Trading System">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="c1"># Process market data updates with high concurrency</span>
</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">geode_client</span> <span class="kn">import</span> <span class="n">ConnectionPool</span><span class="p">,</span> <span class="n">QueryError</span>
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">asyncio</span>
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">random</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">pool</span> <span class="o">=</span> <span class="n">ConnectionPool</span><span class="p">(</span>
</span></span><span class="line"><span class="cl"> <span class="n">host</span><span class="o">=</span><span class="s2">"localhost"</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="n">port</span><span class="o">=</span><span class="mi">3141</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="n">min_size</span><span class="o">=</span><span class="mi">50</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="n">max_size</span><span class="o">=</span><span class="mi">200</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">async</span> <span class="k">def</span> <span class="nf">update_order_book</span><span class="p">(</span><span class="n">symbol</span><span class="p">,</span> <span class="n">price</span><span class="p">,</span> <span class="n">quantity</span><span class="p">):</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"""Update order book with optimistic concurrency"""</span>
</span></span><span class="line"><span class="cl"> <span class="n">max_retries</span> <span class="o">=</span> <span class="mi">10</span>
</span></span><span class="line"><span class="cl"> <span class="k">for</span> <span class="n">attempt</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">max_retries</span><span class="p">):</span>
</span></span><span class="line"><span class="cl"> <span class="k">try</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="k">async</span> <span class="k">with</span> <span class="n">pool</span><span class="o">.</span><span class="n">acquire</span><span class="p">()</span> <span class="k">as</span> <span class="n">conn</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="c1"># Isolation is configured server-side</span>
</span></span><span class="line"><span class="cl"> <span class="k">await</span> <span class="n">conn</span><span class="o">.</span><span class="n">begin</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"> <span class="k">try</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="c1"># Read current order book version</span>
</span></span><span class="line"><span class="cl"> <span class="n">result</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="k">await</span> <span class="n">conn</span><span class="o">.</span><span class="n">query</span><span class="p">(</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"""
</span></span></span><span class="line"><span class="cl"><span class="s2"> MATCH (book:OrderBook {symbol: $symbol})
</span></span></span><span class="line"><span class="cl"><span class="s2"> RETURN book.version AS version,
</span></span></span><span class="line"><span class="cl"><span class="s2"> book.bids AS bids,
</span></span></span><span class="line"><span class="cl"><span class="s2"> book.asks AS asks
</span></span></span><span class="line"><span class="cl"><span class="s2"> """</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="p">{</span><span class="s2">"symbol"</span><span class="p">:</span> <span class="n">symbol</span><span class="p">},</span>
</span></span><span class="line"><span class="cl"> <span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="n">current</span> <span class="o">=</span> <span class="n">result</span><span class="o">.</span><span class="n">rows</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="k">if</span> <span class="n">result</span><span class="o">.</span><span class="n">rows</span> <span class="k">else</span> <span class="kc">None</span>
</span></span><span class="line"><span class="cl"> <span class="k">if</span> <span class="ow">not</span> <span class="n">current</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="k">await</span> <span class="n">conn</span><span class="o">.</span><span class="n">rollback</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"> <span class="k">return</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="c1"># Update order book (business logic)</span>
</span></span><span class="line"><span class="cl"> <span class="n">updated_bids</span><span class="p">,</span> <span class="n">updated_asks</span> <span class="o">=</span> <span class="n">merge_order</span><span class="p">(</span>
</span></span><span class="line"><span class="cl"> <span class="n">current</span><span class="p">[</span><span class="s2">"bids"</span><span class="p">]</span><span class="o">.</span><span class="n">as_array</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="n">current</span><span class="p">[</span><span class="s2">"asks"</span><span class="p">]</span><span class="o">.</span><span class="n">as_array</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="n">price</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="n">quantity</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="c1"># Write with version check</span>
</span></span><span class="line"><span class="cl"> <span class="k">await</span> <span class="n">conn</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"""
</span></span></span><span class="line"><span class="cl"><span class="s2"> MATCH (book:OrderBook {symbol: $symbol})
</span></span></span><span class="line"><span class="cl"><span class="s2"> WHERE book.version = $version
</span></span></span><span class="line"><span class="cl"><span class="s2"> SET book.bids = $bids,
</span></span></span><span class="line"><span class="cl"><span class="s2"> book.asks = $asks,
</span></span></span><span class="line"><span class="cl"><span class="s2"> book.version = $version + 1,
</span></span></span><span class="line"><span class="cl"><span class="s2"> book.last_update = timestamp()
</span></span></span><span class="line"><span class="cl"><span class="s2"> """</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"symbol"</span><span class="p">:</span> <span class="n">symbol</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"version"</span><span class="p">:</span> <span class="n">current</span><span class="p">[</span><span class="s2">"version"</span><span class="p">]</span><span class="o">.</span><span class="n">as_int</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"bids"</span><span class="p">:</span> <span class="n">updated_bids</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"asks"</span><span class="p">:</span> <span class="n">updated_asks</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="p">},</span>
</span></span><span class="line"><span class="cl"> <span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="k">await</span> <span class="n">conn</span><span class="o">.</span><span class="n">commit</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="c1"># Success</span>
</span></span><span class="line"><span class="cl"> <span class="k">except</span> <span class="ne">Exception</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="k">await</span> <span class="n">conn</span><span class="o">.</span><span class="n">rollback</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"> <span class="k">raise</span>
</span></span><span class="line"><span class="cl"> <span class="k">except</span> <span class="n">QueryError</span> <span class="k">as</span> <span class="n">exc</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="k">if</span> <span class="s2">"SERIALIZATION"</span> <span class="ow">not</span> <span class="ow">in</span> <span class="nb">str</span><span class="p">(</span><span class="n">exc</span><span class="p">):</span>
</span></span><span class="line"><span class="cl"> <span class="k">raise</span>
</span></span><span class="line"><span class="cl"> <span class="k">if</span> <span class="n">attempt</span> <span class="o">==</span> <span class="n">max_retries</span> <span class="o">-</span> <span class="mi">1</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="k">raise</span>
</span></span><span class="line"><span class="cl"> <span class="c1"># Exponential backoff with jitter</span>
</span></span><span class="line"><span class="cl"> <span class="k">await</span> <span class="n">asyncio</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="mf">0.001</span> <span class="o">*</span> <span class="p">(</span><span class="mi">2</span> <span class="o">**</span> <span class="n">attempt</span><span class="p">)</span> <span class="o">*</span> <span class="p">(</span><span class="mf">0.5</span> <span class="o">+</span> <span class="n">random</span><span class="o">.</span><span class="n">random</span><span class="p">()))</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Run hundreds of concurrent updates</span>
</span></span><span class="line"><span class="cl"><span class="k">async</span> <span class="k">def</span> <span class="nf">main</span><span class="p">():</span>
</span></span><span class="line"><span class="cl"> <span class="n">tasks</span> <span class="o">=</span> <span class="p">[]</span>
</span></span><span class="line"><span class="cl"> <span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">1000</span><span class="p">):</span>
</span></span><span class="line"><span class="cl"> <span class="n">symbol</span> <span class="o">=</span> <span class="n">random</span><span class="o">.</span><span class="n">choice</span><span class="p">([</span><span class="s1">'AAPL'</span><span class="p">,</span> <span class="s1">'GOOGL'</span><span class="p">,</span> <span class="s1">'MSFT'</span><span class="p">])</span>
</span></span><span class="line"><span class="cl"> <span class="n">price</span> <span class="o">=</span> <span class="n">random</span><span class="o">.</span><span class="n">uniform</span><span class="p">(</span><span class="mi">100</span><span class="p">,</span> <span class="mi">200</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="n">quantity</span> <span class="o">=</span> <span class="n">random</span><span class="o">.</span><span class="n">randint</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">100</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="n">tasks</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">update_order_book</span><span class="p">(</span><span class="n">symbol</span><span class="p">,</span> <span class="n">price</span><span class="p">,</span> <span class="n">quantity</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="k">await</span> <span class="n">asyncio</span><span class="o">.</span><span class="n">gather</span><span class="p">(</span><span class="o">*</span><span class="n">tasks</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="c1"># All updates complete with correct concurrency control</span>
</span></span></code></pre></div>
<h4 id="social-media-feed-generation" class="position-relative d-flex align-items-center group">
<span>Social Media Feed Generation</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="social-media-feed-generation"
aria-haspopup="dialog"
aria-label="Share link: Social Media Feed Generation">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="c1"># Generate personalized feeds with concurrent reads</span>
</span></span><span class="line"><span class="cl"><span class="k">async</span> <span class="k">def</span> <span class="nf">generate_user_feed</span><span class="p">(</span><span class="n">user_id</span><span class="p">,</span> <span class="n">limit</span><span class="o">=</span><span class="mi">50</span><span class="p">):</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"""Generate feed by reading from multiple sources concurrently"""</span>
</span></span><span class="line"><span class="cl"> <span class="k">async</span> <span class="k">with</span> <span class="n">pool</span><span class="o">.</span><span class="n">acquire</span><span class="p">()</span> <span class="k">as</span> <span class="n">conn</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="c1"># Isolation is configured server-side</span>
</span></span><span class="line"><span class="cl"> <span class="k">await</span> <span class="n">conn</span><span class="o">.</span><span class="n">begin</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"> <span class="k">try</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="c1"># Posts from followed users</span>
</span></span><span class="line"><span class="cl"> <span class="n">following_posts</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="k">await</span> <span class="n">conn</span><span class="o">.</span><span class="n">query</span><span class="p">(</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"""
</span></span></span><span class="line"><span class="cl"><span class="s2"> MATCH (u:User {id: $user_id})-[:FOLLOWS]->(f:User)
</span></span></span><span class="line"><span class="cl"><span class="s2"> MATCH (f)-[:POSTED]->(p:Post)
</span></span></span><span class="line"><span class="cl"><span class="s2"> WHERE p.created_at > datetime().minusDays(7)
</span></span></span><span class="line"><span class="cl"><span class="s2"> RETURN p
</span></span></span><span class="line"><span class="cl"><span class="s2"> ORDER BY p.created_at DESC
</span></span></span><span class="line"><span class="cl"><span class="s2"> LIMIT 30
</span></span></span><span class="line"><span class="cl"><span class="s2"> """</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="p">{</span><span class="s2">"user_id"</span><span class="p">:</span> <span class="n">user_id</span><span class="p">},</span>
</span></span><span class="line"><span class="cl"> <span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="c1"># Trending posts</span>
</span></span><span class="line"><span class="cl"> <span class="n">trending</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="k">await</span> <span class="n">conn</span><span class="o">.</span><span class="n">query</span><span class="p">(</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"""
</span></span></span><span class="line"><span class="cl"><span class="s2"> MATCH (p:Post)
</span></span></span><span class="line"><span class="cl"><span class="s2"> WHERE p.created_at > datetime().minusHours(24)
</span></span></span><span class="line"><span class="cl"><span class="s2"> RETURN p
</span></span></span><span class="line"><span class="cl"><span class="s2"> ORDER BY p.engagement_score DESC
</span></span></span><span class="line"><span class="cl"><span class="s2"> LIMIT 10
</span></span></span><span class="line"><span class="cl"><span class="s2"> """</span>
</span></span><span class="line"><span class="cl"> <span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="c1"># Targeted ads</span>
</span></span><span class="line"><span class="cl"> <span class="n">ads</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="k">await</span> <span class="n">conn</span><span class="o">.</span><span class="n">query</span><span class="p">(</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"""
</span></span></span><span class="line"><span class="cl"><span class="s2"> MATCH (u:User {id: $user_id})-[:INTERESTED_IN]->(i:Interest)
</span></span></span><span class="line"><span class="cl"><span class="s2"> MATCH (a:Ad)-[:TARGETS]->(i)
</span></span></span><span class="line"><span class="cl"><span class="s2"> WHERE NOT (u)-[:DISMISSED]->(a)
</span></span></span><span class="line"><span class="cl"><span class="s2"> RETURN a
</span></span></span><span class="line"><span class="cl"><span class="s2"> LIMIT 5
</span></span></span><span class="line"><span class="cl"><span class="s2"> """</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="p">{</span><span class="s2">"user_id"</span><span class="p">:</span> <span class="n">user_id</span><span class="p">},</span>
</span></span><span class="line"><span class="cl"> <span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="k">await</span> <span class="n">conn</span><span class="o">.</span><span class="n">commit</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"> <span class="k">except</span> <span class="ne">Exception</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="k">await</span> <span class="n">conn</span><span class="o">.</span><span class="n">rollback</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"> <span class="k">raise</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="c1"># Merge and rank results (all from consistent snapshot)</span>
</span></span><span class="line"><span class="cl"> <span class="n">feed</span> <span class="o">=</span> <span class="n">merge_feed_items</span><span class="p">(</span>
</span></span><span class="line"><span class="cl"> <span class="n">following_posts</span><span class="o">.</span><span class="n">rows</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="n">trending</span><span class="o">.</span><span class="n">rows</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="n">ads</span><span class="o">.</span><span class="n">rows</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="n">feed</span><span class="p">[:</span><span class="n">limit</span><span class="p">]</span>
</span></span></code></pre></div>
<h4 id="inventory-management-with-reservations" class="position-relative d-flex align-items-center group">
<span>Inventory Management with Reservations</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="inventory-management-with-reservations"
aria-haspopup="dialog"
aria-label="Share link: Inventory Management with Reservations">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="c1"># Handle concurrent product reservations</span>
</span></span><span class="line"><span class="cl"><span class="k">async</span> <span class="k">def</span> <span class="nf">reserve_inventory</span><span class="p">(</span><span class="n">product_id</span><span class="p">,</span> <span class="n">quantity</span><span class="p">,</span> <span class="n">order_id</span><span class="p">):</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"""Reserve inventory with pessimistic locking for critical section"""</span>
</span></span><span class="line"><span class="cl"> <span class="k">async</span> <span class="k">with</span> <span class="n">pool</span><span class="o">.</span><span class="n">acquire</span><span class="p">()</span> <span class="k">as</span> <span class="n">conn</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="c1"># Isolation is configured server-side</span>
</span></span><span class="line"><span class="cl"> <span class="k">await</span> <span class="n">conn</span><span class="o">.</span><span class="n">begin</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"> <span class="k">try</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="c1"># Lock product row for update</span>
</span></span><span class="line"><span class="cl"> <span class="n">result</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="k">await</span> <span class="n">conn</span><span class="o">.</span><span class="n">query</span><span class="p">(</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"""
</span></span></span><span class="line"><span class="cl"><span class="s2"> MATCH (p:Product {id: $product_id})
</span></span></span><span class="line"><span class="cl"><span class="s2"> WHERE p.available_quantity >= $quantity
</span></span></span><span class="line"><span class="cl"><span class="s2"> RETURN p.available_quantity AS available
</span></span></span><span class="line"><span class="cl"><span class="s2"> """</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="p">{</span><span class="s2">"product_id"</span><span class="p">:</span> <span class="n">product_id</span><span class="p">,</span> <span class="s2">"quantity"</span><span class="p">:</span> <span class="n">quantity</span><span class="p">},</span>
</span></span><span class="line"><span class="cl"> <span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="k">if</span> <span class="ow">not</span> <span class="n">result</span><span class="o">.</span><span class="n">rows</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="k">raise</span> <span class="n">InsufficientInventoryError</span><span class="p">(</span><span class="s2">"Not enough inventory"</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="c1"># Create reservation</span>
</span></span><span class="line"><span class="cl"> <span class="k">await</span> <span class="n">conn</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"""
</span></span></span><span class="line"><span class="cl"><span class="s2"> MATCH (p:Product {id: $product_id})
</span></span></span><span class="line"><span class="cl"><span class="s2"> SET p.available_quantity = p.available_quantity - $quantity
</span></span></span><span class="line"><span class="cl"><span class="s2">
</span></span></span><span class="line"><span class="cl"><span class="s2"> CREATE (r:Reservation {
</span></span></span><span class="line"><span class="cl"><span class="s2"> id: $order_id,
</span></span></span><span class="line"><span class="cl"><span class="s2"> product_id: $product_id,
</span></span></span><span class="line"><span class="cl"><span class="s2"> quantity: $quantity,
</span></span></span><span class="line"><span class="cl"><span class="s2"> reserved_at: timestamp(),
</span></span></span><span class="line"><span class="cl"><span class="s2"> expires_at: timestamp().plusMinutes(15)
</span></span></span><span class="line"><span class="cl"><span class="s2"> })
</span></span></span><span class="line"><span class="cl"><span class="s2"> CREATE (p)-[:HAS_RESERVATION]->(r)
</span></span></span><span class="line"><span class="cl"><span class="s2"> """</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"product_id"</span><span class="p">:</span> <span class="n">product_id</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"quantity"</span><span class="p">:</span> <span class="n">quantity</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"order_id"</span><span class="p">:</span> <span class="n">order_id</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="p">},</span>
</span></span><span class="line"><span class="cl"> <span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="k">await</span> <span class="n">conn</span><span class="o">.</span><span class="n">commit</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"> <span class="k">except</span> <span class="ne">Exception</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="k">await</span> <span class="n">conn</span><span class="o">.</span><span class="n">rollback</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"> <span class="k">raise</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Background task to release expired reservations</span>
</span></span><span class="line"><span class="cl"><span class="k">async</span> <span class="k">def</span> <span class="nf">release_expired_reservations</span><span class="p">():</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"""Periodic cleanup of expired reservations"""</span>
</span></span><span class="line"><span class="cl"> <span class="k">while</span> <span class="kc">True</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="k">async</span> <span class="k">with</span> <span class="n">pool</span><span class="o">.</span><span class="n">acquire</span><span class="p">()</span> <span class="k">as</span> <span class="n">conn</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="k">await</span> <span class="n">conn</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"""
</span></span></span><span class="line"><span class="cl"><span class="s2"> MATCH (p:Product)-[rel:HAS_RESERVATION]->(r:Reservation)
</span></span></span><span class="line"><span class="cl"><span class="s2"> WHERE r.expires_at < timestamp()
</span></span></span><span class="line"><span class="cl"><span class="s2">
</span></span></span><span class="line"><span class="cl"><span class="s2"> SET p.available_quantity = p.available_quantity + r.quantity
</span></span></span><span class="line"><span class="cl"><span class="s2">
</span></span></span><span class="line"><span class="cl"><span class="s2"> DELETE rel, r
</span></span></span><span class="line"><span class="cl"><span class="s2"> """</span>
</span></span><span class="line"><span class="cl"> <span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="k">await</span> <span class="n">asyncio</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="mi">60</span><span class="p">)</span> <span class="c1"># Check every minute</span>
</span></span></code></pre></div>
<h3 id="concurrency-benchmarking" class="position-relative d-flex align-items-center group">
<span>Concurrency Benchmarking</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="concurrency-benchmarking"
aria-haspopup="dialog"
aria-label="Share link: Concurrency Benchmarking">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3>
<h4 id="load-testing-framework" class="position-relative d-flex align-items-center group">
<span>Load Testing Framework</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="load-testing-framework"
aria-haspopup="dialog"
aria-label="Share link: Load Testing Framework">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">asyncio</span>
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">time</span>
</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">statistics</span> <span class="kn">import</span> <span class="n">mean</span><span class="p">,</span> <span class="n">stdev</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">class</span> <span class="nc">ConcurrencyBenchmark</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">pool</span><span class="p">,</span> <span class="n">test_duration</span><span class="o">=</span><span class="mi">60</span><span class="p">):</span>
</span></span><span class="line"><span class="cl"> <span class="bp">self</span><span class="o">.</span><span class="n">pool</span> <span class="o">=</span> <span class="n">pool</span>
</span></span><span class="line"><span class="cl"> <span class="bp">self</span><span class="o">.</span><span class="n">test_duration</span> <span class="o">=</span> <span class="n">test_duration</span>
</span></span><span class="line"><span class="cl"> <span class="bp">self</span><span class="o">.</span><span class="n">latencies</span> <span class="o">=</span> <span class="p">[]</span>
</span></span><span class="line"><span class="cl"> <span class="bp">self</span><span class="o">.</span><span class="n">errors</span> <span class="o">=</span> <span class="mi">0</span>
</span></span><span class="line"><span class="cl"> <span class="bp">self</span><span class="o">.</span><span class="n">successes</span> <span class="o">=</span> <span class="mi">0</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="k">async</span> <span class="k">def</span> <span class="nf">worker</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">worker_id</span><span class="p">):</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"""Individual worker executing queries"""</span>
</span></span><span class="line"><span class="cl"> <span class="n">start_time</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="k">while</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span> <span class="o">-</span> <span class="n">start_time</span> <span class="o"><</span> <span class="bp">self</span><span class="o">.</span><span class="n">test_duration</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="n">query_start</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"> <span class="k">try</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="k">async</span> <span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">pool</span><span class="o">.</span><span class="n">acquire</span><span class="p">()</span> <span class="k">as</span> <span class="n">client</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="c1"># Execute test query</span>
</span></span><span class="line"><span class="cl"> <span class="k">await</span> <span class="n">client</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">"""
</span></span></span><span class="line"><span class="cl"><span class="s2"> MATCH (u:User)
</span></span></span><span class="line"><span class="cl"><span class="s2"> WHERE u.id = $id
</span></span></span><span class="line"><span class="cl"><span class="s2"> RETURN u
</span></span></span><span class="line"><span class="cl"><span class="s2"> """</span><span class="p">,</span> <span class="p">{</span><span class="s2">"id"</span><span class="p">:</span> <span class="n">worker_id</span> <span class="o">%</span> <span class="mi">10000</span><span class="p">})</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="n">latency</span> <span class="o">=</span> <span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span> <span class="o">-</span> <span class="n">query_start</span><span class="p">)</span> <span class="o">*</span> <span class="mi">1000</span> <span class="c1"># ms</span>
</span></span><span class="line"><span class="cl"> <span class="bp">self</span><span class="o">.</span><span class="n">latencies</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">latency</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="bp">self</span><span class="o">.</span><span class="n">successes</span> <span class="o">+=</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl"> <span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="bp">self</span><span class="o">.</span><span class="n">errors</span> <span class="o">+=</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="k">async</span> <span class="k">def</span> <span class="nf">run</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">concurrency_level</span><span class="p">):</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"""Run benchmark with specified concurrency"""</span>
</span></span><span class="line"><span class="cl"> <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Running benchmark: </span><span class="si">{</span><span class="n">concurrency_level</span><span class="si">}</span><span class="s2"> concurrent workers"</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="n">workers</span> <span class="o">=</span> <span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">worker</span><span class="p">(</span><span class="n">i</span><span class="p">)</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">concurrency_level</span><span class="p">)]</span>
</span></span><span class="line"><span class="cl"> <span class="k">await</span> <span class="n">asyncio</span><span class="o">.</span><span class="n">gather</span><span class="p">(</span><span class="o">*</span><span class="n">workers</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="c1"># Calculate statistics</span>
</span></span><span class="line"><span class="cl"> <span class="n">total_queries</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">successes</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">errors</span>
</span></span><span class="line"><span class="cl"> <span class="n">qps</span> <span class="o">=</span> <span class="n">total_queries</span> <span class="o">/</span> <span class="bp">self</span><span class="o">.</span><span class="n">test_duration</span>
</span></span><span class="line"><span class="cl"> <span class="n">avg_latency</span> <span class="o">=</span> <span class="n">mean</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">latencies</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="n">p95_latency</span> <span class="o">=</span> <span class="nb">sorted</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">latencies</span><span class="p">)[</span><span class="nb">int</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">latencies</span><span class="p">)</span> <span class="o">*</span> <span class="mf">0.95</span><span class="p">)]</span>
</span></span><span class="line"><span class="cl"> <span class="n">p99_latency</span> <span class="o">=</span> <span class="nb">sorted</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">latencies</span><span class="p">)[</span><span class="nb">int</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">latencies</span><span class="p">)</span> <span class="o">*</span> <span class="mf">0.99</span><span class="p">)]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"""
</span></span></span><span class="line"><span class="cl"><span class="s2">Benchmark Results:
</span></span></span><span class="line"><span class="cl"><span class="s2"> Total Queries: </span><span class="si">{</span><span class="n">total_queries</span><span class="si">}</span><span class="s2">
</span></span></span><span class="line"><span class="cl"><span class="s2"> Successes: </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">successes</span><span class="si">}</span><span class="s2">
</span></span></span><span class="line"><span class="cl"><span class="s2"> Errors: </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">errors</span><span class="si">}</span><span class="s2">
</span></span></span><span class="line"><span class="cl"><span class="s2"> QPS: </span><span class="si">{</span><span class="n">qps</span><span class="si">:</span><span class="s2">.2f</span><span class="si">}</span><span class="s2">
</span></span></span><span class="line"><span class="cl"><span class="s2"> Avg Latency: </span><span class="si">{</span><span class="n">avg_latency</span><span class="si">:</span><span class="s2">.2f</span><span class="si">}</span><span class="s2">ms
</span></span></span><span class="line"><span class="cl"><span class="s2"> P95 Latency: </span><span class="si">{</span><span class="n">p95_latency</span><span class="si">:</span><span class="s2">.2f</span><span class="si">}</span><span class="s2">ms
</span></span></span><span class="line"><span class="cl"><span class="s2"> P99 Latency: </span><span class="si">{</span><span class="n">p99_latency</span><span class="si">:</span><span class="s2">.2f</span><span class="si">}</span><span class="s2">ms
</span></span></span><span class="line"><span class="cl"><span class="s2"> """</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Run benchmarks at various concurrency levels</span>
</span></span><span class="line"><span class="cl"><span class="k">async</span> <span class="k">def</span> <span class="nf">main</span><span class="p">():</span>
</span></span><span class="line"><span class="cl"> <span class="n">pool</span> <span class="o">=</span> <span class="n">ConnectionPool</span><span class="p">(</span><span class="s2">"localhost"</span><span class="p">,</span> <span class="mi">3141</span><span class="p">,</span> <span class="n">max_connections</span><span class="o">=</span><span class="mi">500</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="k">for</span> <span class="n">concurrency</span> <span class="ow">in</span> <span class="p">[</span><span class="mi">10</span><span class="p">,</span> <span class="mi">50</span><span class="p">,</span> <span class="mi">100</span><span class="p">,</span> <span class="mi">200</span><span class="p">,</span> <span class="mi">500</span><span class="p">]:</span>
</span></span><span class="line"><span class="cl"> <span class="n">benchmark</span> <span class="o">=</span> <span class="n">ConcurrencyBenchmark</span><span class="p">(</span><span class="n">pool</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="k">await</span> <span class="n">benchmark</span><span class="o">.</span><span class="n">run</span><span class="p">(</span><span class="n">concurrency</span><span class="p">)</span>
</span></span></code></pre></div>
<h4 id="results-interpretation" class="position-relative d-flex align-items-center group">
<span>Results Interpretation</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="results-interpretation"
aria-haspopup="dialog"
aria-label="Share link: Results Interpretation">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p>Use the benchmark output to identify scaling behavior:</p>
<ul>
<li>Look for near-linear scaling as concurrency increases until saturation.</li>
<li>Expect throughput to plateau once CPU or I/O becomes the bottleneck.</li>
<li>Track p95/p99 latency; rising tail latency signals saturation.</li>
<li>Tune pool sizes and worker counts based on your hardware and workload.</li>
</ul>
<h3 id="further-reading" class="position-relative d-flex align-items-center group">
<span>Further Reading</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="further-reading"
aria-haspopup="dialog"
aria-label="Share link: Further Reading">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3><ul>
<li><strong>Concurrency Control Guide</strong>: <code>/docs/core-concepts/concurrency-control/</code></li>
<li><strong>Transaction Isolation</strong>: <code>/docs/transactions/isolation-levels/</code></li>
<li><strong>MVCC Implementation</strong>: <code>/docs/architecture/mvcc/</code></li>
<li><strong>Deadlock Prevention</strong>: <code>/docs/troubleshooting/deadlocks/</code></li>
<li><strong>Connection Pooling</strong>: <code>/docs/client-libraries/connection-pooling/</code></li>
<li><strong>Lock-Free Programming</strong>: <a
href="http://www.1024cores.net/home/lock-free-algorithms"
aria-label="1024cores.net – opens in new window"
target="_blank" rel="noopener noreferrer"
>1024cores.net
<span aria-hidden="true" class="external-icon">↗</span>
</a>
</li>
<li><strong>Transaction Processing</strong>: <a
href="http://jimgray.azurewebsites.net/papers/thetransactionconcept.pdf"
aria-label="Gray &amp; Reuter – opens in new window"
target="_blank" rel="noopener noreferrer"
>Gray & Reuter
<span aria-hidden="true" class="external-icon">↗</span>
</a>
</li>
</ul>
Tag
2 articles
Concurrency Control
Explore Geode documentation tagged with concurrency. Learn about concurrency features, best practices, and implementation details.