75 lines
5.6 KiB
XML
75 lines
5.6 KiB
XML
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 720 1180" role="img" aria-labelledby="title desc">
|
|
<title id="title">Учебная шкала двух операций и границы блокировки</title>
|
|
<desc id="desc">Вертикальная схема показывает начальное состояние с двумя дежурными, небезопасное расписание двух операций, нарушающее инвариант, и альтернативное расписание, где вторая операция ждёт границу блокировки, читает новое состояние и отказывается от записи.</desc>
|
|
<style>
|
|
.bg { fill: #f6f8fb; }
|
|
.panel { fill: #ffffff; stroke: #d9e1ec; stroke-width: 2; }
|
|
.warn { fill: #fff0f0; stroke: #d9534f; stroke-width: 2; }
|
|
.safe { fill: #effaf3; stroke: #2a8f5b; stroke-width: 2; }
|
|
.muted { fill: #eaf0f7; stroke: #7f91a8; stroke-width: 2; }
|
|
.step { fill: #234a78; }
|
|
.red { fill: #c64040; }
|
|
.green { fill: #187648; }
|
|
.ink { fill: #15263b; }
|
|
.sub { fill: #52657b; }
|
|
text { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Arial, sans-serif; }
|
|
.title { font-size: 31px; font-weight: 700; }
|
|
.lead { font-size: 21px; font-weight: 500; }
|
|
.label { font-size: 20px; font-weight: 700; }
|
|
.body { font-size: 20px; }
|
|
.small { font-size: 18px; }
|
|
.mono { font-family: "SFMono-Regular", Consolas, monospace; font-size: 18px; }
|
|
</style>
|
|
<rect class="bg" width="720" height="1180" rx="26"/>
|
|
<rect x="32" y="28" width="656" height="118" rx="18" class="panel"/>
|
|
<text x="62" y="74" class="title ink">Граница транзакции: один инвариант</text>
|
|
<text x="62" y="109" class="lead sub">Учебный schedule: два запроса хотят снять разных</text>
|
|
<text x="62" y="135" class="lead sub">дежурных, но обязан остаться хотя бы один.</text>
|
|
|
|
<circle cx="62" cy="202" r="23" class="step"/>
|
|
<text x="55" y="209" class="label" fill="#ffffff">1</text>
|
|
<rect x="102" y="166" width="586" height="106" rx="16" class="muted"/>
|
|
<text x="128" y="204" class="label ink">Общее начальное состояние</text>
|
|
<text x="128" y="235" class="body sub">Анна = on, Борис = on; activeCount = 2; invariant: ≥ 1</text>
|
|
|
|
<line x1="62" y1="225" x2="62" y2="322" stroke="#7f91a8" stroke-width="4"/>
|
|
<circle cx="62" cy="350" r="23" class="red"/>
|
|
<text x="55" y="357" class="label" fill="#ffffff">2</text>
|
|
<rect x="102" y="302" width="586" height="300" rx="16" class="warn"/>
|
|
<text x="128" y="342" class="label ink">Без общей границы — оба читают 2</text>
|
|
<rect x="128" y="366" width="242" height="166" rx="12" fill="#ffffff" stroke="#efb6b4" stroke-width="2"/>
|
|
<text x="150" y="403" class="label red">T1: Анна</text>
|
|
<text x="150" y="435" class="body ink">read active = 2</text>
|
|
<text x="150" y="466" class="body ink">write Анна = off</text>
|
|
<text x="150" y="498" class="small sub">commit</text>
|
|
<rect x="408" y="366" width="242" height="166" rx="12" fill="#ffffff" stroke="#efb6b4" stroke-width="2"/>
|
|
<text x="430" y="403" class="label red">T2: Борис</text>
|
|
<text x="430" y="435" class="body ink">read active = 2</text>
|
|
<text x="430" y="466" class="body ink">write Борис = off</text>
|
|
<text x="430" y="498" class="small sub">commit</text>
|
|
<text x="128" y="572" class="body red">Итог: activeCount = 0. Записи разные, инвариант нарушен.</text>
|
|
|
|
<line x1="62" y1="373" x2="62" y2="660" stroke="#7f91a8" stroke-width="4"/>
|
|
<circle cx="62" cy="688" r="23" class="green"/>
|
|
<text x="55" y="695" class="label" fill="#ffffff">3</text>
|
|
<rect x="102" y="640" width="586" height="364" rx="16" class="safe"/>
|
|
<text x="128" y="682" class="label ink">Одна граница для строк инварианта</text>
|
|
<text x="128" y="709" class="body sub">Фиксированный порядок: [Анна, Борис].</text>
|
|
<text x="128" y="735" class="body sub">Учебная блокировка — не движок БД.</text>
|
|
<rect x="128" y="744" width="510" height="57" rx="12" fill="#ffffff" stroke="#b9e0c8" stroke-width="2"/>
|
|
<text x="150" y="775" class="body ink">T1 захватывает [Анна, Борис]</text>
|
|
<text x="150" y="797" class="small sub">→ читает 2 → Анна = off</text>
|
|
<rect x="128" y="819" width="510" height="57" rx="12" fill="#ffffff" stroke="#b9e0c8" stroke-width="2"/>
|
|
<text x="150" y="850" class="body ink">T2 просит те же строки</text>
|
|
<text x="150" y="872" class="small sub">→ ждёт завершения T1</text>
|
|
<rect x="128" y="894" width="510" height="76" rx="12" fill="#ffffff" stroke="#b9e0c8" stroke-width="2"/>
|
|
<text x="150" y="923" class="body ink">T2 читает уже 1 → precondition false</text>
|
|
<text x="150" y="947" class="small sub">→ rollback без записи</text>
|
|
<text x="128" y="994" class="body green">Итог модели: activeCount = 1; инвариант сохранён.</text>
|
|
|
|
<rect x="32" y="1030" width="656" height="116" rx="18" fill="#172b45"/>
|
|
<text x="58" y="1070" class="label" fill="#ffffff">Граница доказательства</text>
|
|
<text x="58" y="1101" class="small" fill="#dbe8f5">Схема объясняет только фиксированную in-memory модель.</text>
|
|
<text x="58" y="1128" class="small" fill="#dbe8f5">Она не запускала PostgreSQL и не измеряла настоящие wait или locks.</text>
|
|
</svg>
|