Slides
This commit is contained in:
parent
dd1fe23458
commit
ed4460808f
|
@ -104,15 +104,18 @@ schedule:
|
|||
slides: slide/2021-04-06-TheoryOfTransactions.html
|
||||
- date: "Apr. 8"
|
||||
topic: "Transactions: Pessimistic"
|
||||
materials:
|
||||
slides: slide/2021-04-08-Locking.html
|
||||
- date: "Apr. 12"
|
||||
due: "Checkpoint 2"
|
||||
- date: "Apr. 13"
|
||||
topic: "Aggregation + Checkpoint 3"
|
||||
- date: "Apr. 15"
|
||||
topic: "Transactions: Optimistic"
|
||||
due: "Checkpoint 3"
|
||||
- date: "Apr. 20"
|
||||
topic: "Indexing Review + Checkpoint 4"
|
||||
- date: "Apr. 22"
|
||||
due: "Checkpoint 3"
|
||||
topic: "Logging + Recovery"
|
||||
- date: "Apr. 27"
|
||||
topic: "Distributed Commit"
|
||||
|
|
590
src/teaching/cse-562/2021sp/slide/2021-04-08-Locking.erb
Normal file
590
src/teaching/cse-562/2021sp/slide/2021-04-08-Locking.erb
Normal file
|
@ -0,0 +1,590 @@
|
|||
---
|
||||
template: templates/cse4562_2021_slides.erb
|
||||
title: Pessimistic Concurrency Control
|
||||
date: April 8, 2021
|
||||
textbook: Ch. 18.3-18.7, 19.2
|
||||
---
|
||||
<!-- 2019 by OK
|
||||
This ended up being a bit long, but mostly because I spent a lot of time going over
|
||||
Happens-Before again. Especially since the last lecture ended up a bit short,
|
||||
it might be worth doing some more thorough examples next year.
|
||||
|
||||
Another point that might be made better is that locking is used to enforce ORDER and not ISOLATION. That is, classical OS-style locking is used to keep multiple transactions from executing in parallel (strict serial ordering). 2-phase locking is used to ensure the relative ordering of conflicts. A timeline along the lines of the validation tests in the OCC lecture might be helpful.
|
||||
-->
|
||||
|
||||
<section>
|
||||
<section>
|
||||
<dl>
|
||||
<div class="fragment">
|
||||
<dt>Schedule</dt>
|
||||
<dd>A sequence of read and writes from one or more transactions to objects</dd>
|
||||
</div>
|
||||
<div class="fragment">
|
||||
<dt>Serial Schedule</dt>
|
||||
<dd>A schedule with <u>no</u> interleaving</dd>
|
||||
<dd class="fragment">... but with an arbitrary transaction order</dd>
|
||||
</div>
|
||||
<div class="fragment">
|
||||
<dt>Serial<u>izable</u> Schedule</dt>
|
||||
<dd>A schedule that produces the same output as a serial schedule</dd>
|
||||
</div>
|
||||
</dl>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<table style="float: left;">
|
||||
<tr><th>Time</th><th>T1</th><th>T2</th><th>T3</th></tr>
|
||||
<tr>
|
||||
<td> | </td>
|
||||
<td><code>W(A)</code></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td> | </td>
|
||||
<td></td>
|
||||
<td><code>W(A)</code></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td> | </td>
|
||||
<td></td>
|
||||
<td><code>W(B)</code></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td> | </td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td><code>W(B)</code></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td> ↓ </td>
|
||||
<td><code>W(B)</code></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
</table>
|
||||
<p class="fragment" style="font-size: 80%">T1's write to A "happens before" T2's write</p>
|
||||
<p class="fragment" style="font-size: 80%">T2's write to B "happens before" T3's write</p>
|
||||
<p class="fragment" style="font-size: 80%">T2's write to B "happens before" T1's write</p>
|
||||
<img src="2021-04-08/DependencyCycle.svg" height="150px" class="fragment"/>
|
||||
<p class="fragment" style="font-size: 80%">Cycle! No equivalent serial schedule!</p>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<p>An acyclic "Happens Before" or <u>Dependency Graph</u> is conflict serializable.</p>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<h3>Forcing Acyclicity</h3>
|
||||
<dl>
|
||||
<div class="fragment highlight-blue">
|
||||
<dt>Locking</dt>
|
||||
<dd></dd>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<dt>Snapshot Isolation</dt>
|
||||
<dd></dd>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<dt>Timestamp Concurrency Control<span style="font-size: 80%; vertical-align: top">*</span></dt>
|
||||
<dd></dd>
|
||||
</div>
|
||||
</dl>
|
||||
</section>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<section>
|
||||
<p><b>Goal:</b> Enforce acyclic conflict graphs</p>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<p><b>Observation:</b> Conflicts only occur on accesses to the same object</p>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<p><b>Idea:</b> When a second transaction tries to access an object, require the first to COMMIT or ABORT first.</p>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<p><b>Idea:</b> When a second transaction tries to access an object, require the first to <strike>COMMIT or ABORT first</strike> agree to never create more conflicts.</p>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<h3>2-Phase Locking</h3>
|
||||
|
||||
<p class="fragment">Create one lock for each object.</p>
|
||||
<p class="fragment">Each transaction operates in two "phases".</p>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<dl>
|
||||
<div class="fragment">
|
||||
<dt>Acquire Phase</dt>
|
||||
<dd>Before accessing an object, the transaction must acquire the object's lock.</dd>
|
||||
<dd class="fragment">The transaction does not release locks.</dd>
|
||||
</div>
|
||||
|
||||
<div class="fragment">
|
||||
<dt>Release Phase</dt>
|
||||
<dd>A transaction can release locks</dd>
|
||||
<dd class="fragment">A transaction can never again access an object it doesn't have a lock for.</dd>
|
||||
</div>
|
||||
</dl>
|
||||
|
||||
<p class="fragment">In practice, the release phase happens all at once at the end</p>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<img src="2021-04-08/2PhaseLocking.svg" height="400px"/>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<table style="float: left;">
|
||||
<tr><th>Time</th><th>T1</th><th>T2</th><th>T3</th></tr>
|
||||
<tr>
|
||||
<td> | </td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td><code>R(C)</code></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td> | </td>
|
||||
<td><code>W(A)</code></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td> | </td>
|
||||
<td></td>
|
||||
<td><code>R(B)</code></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td> | </td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td><code>W(C)</code></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td> | </td>
|
||||
<td><code>W(B)</code></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td> ↓ </td>
|
||||
<td></td>
|
||||
<td><code>W(C)</code></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
</table>
|
||||
<img src="2021-04-08/2PLDepGraph.svg" style="margin-top: 100px;">
|
||||
<p class="fragment">Conflict Serializable.</p>
|
||||
<p class="fragment">Can 2PL create this schedule?</p>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<div style="float:right">
|
||||
<table>
|
||||
<tr><td style="vertical-align: middle"><code>L(...)</code></td><td>Acquire <span style="font-size: 70%">(Lock)</span></td></tr>
|
||||
<tr><td style="vertical-align: middle"><code>U(...)</code></td><td>Release <span style="font-size: 70%">(Unlock)</span></td></tr>
|
||||
</table>
|
||||
|
||||
<p class="fragment" data-fragment-index="11" style="margin-top: 50px;">2PL <b>can</b> create this schedule</p>
|
||||
</div>
|
||||
<table style="font-size: 50%">
|
||||
<tr><th>Time</th><th>T1</th><th>T2</th><th>T3</th></tr>
|
||||
<tr>
|
||||
<td> | <br/> | </td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td><code class="fragment" data-fragment-index="1">L(C)</code><br/><code>R(C)</code></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td> | <br/> | </td>
|
||||
<td><code class="fragment" data-fragment-index="2">L(A)</code><br/><code>W(A)</code></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td> | <br/> | </td>
|
||||
<td></td>
|
||||
<td><code class="fragment" data-fragment-index="3">L(B)</code><br/><code>R(B)</code></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td> | <br/> | </td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td><code>W(C)</code><br/><code class="fragment" data-fragment-index="10">U(C)</code></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td> | <br/> | </td>
|
||||
<td></td>
|
||||
<td><code class="fragment" data-fragment-index="9">L(C)</code><br/><span class="fragment highlight-red" data-fragment-index="8"><code class="fragment" data-fragment-index="7">U(B)</code></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td> | <br/> | </td>
|
||||
<td><span class="fragment highlight-red" data-fragment-index="5"><code class="fragment" data-fragment-index="4">L(B)</code></span><br/><code>W(B)</code></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td> | <br/> ↓ </td>
|
||||
<td></td>
|
||||
<td><span class="fragment fade-out" data-fragment-index="9"><code class="fragment" data-fragment-index="6" style="color: red">L(C)</code></span><br/><code>W(C)</code></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
</table>
|
||||
</section>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<section>
|
||||
<h2>Optimizations</h2>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<p><b>Observation 1: </b> Read-Read conflicts aren't a problem</p>
|
||||
|
||||
<p class="fragment"><b>Solution: </b> Reader/Writer Locks</p>
|
||||
|
||||
<p class="fragment" style="font-size: 70%">(Any number of readers <b>or</b> one writer can hold the lock)</p>
|
||||
|
||||
<p class="fragment">... also called Shared (S)/Exclusive (X) locks</p>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<table style="font-size: 200%">
|
||||
<tr><td></td><td></td><td colspan=2 style="font-size: 60%; font-weight: bold;">Requested</td></tr>
|
||||
<tr><td></td><td></td><td style="font-weight: bold;">S</td><td style="font-weight: bold;">X</td></tr>
|
||||
<tr><td rowspan=2 style="font-size: 60%; font-weight: bold;">H<br/>e<br/>l<br/>d</td>
|
||||
<td style="font-weight: bold">S</td>
|
||||
<td style="background-color: lightblue">Allow</td>
|
||||
<td style="background-color: bisque">Block</td></tr>
|
||||
<tr><td style="font-weight: bold;">X</td>
|
||||
<td style="background-color: bisque">Block</td>
|
||||
<td style="background-color: bisque">Block</td></tr>
|
||||
</table>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<h3>An object is ...</h3>
|
||||
<ul>
|
||||
<li>... a table</li>
|
||||
<li>... a record</li>
|
||||
<li>... a page</li>
|
||||
<li>... a column</li>
|
||||
</ul>
|
||||
<p class="fragment">Which should be used?</p>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<p><b>Observation 1:</b> Too coarse locking prevents concurrency</p>
|
||||
<p><b>Observation 2:</b> Too fine locking is slow</p>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<p><b>Idea 1:</b> Separate locks for tables, pages, rows, cells.</p>
|
||||
<p class="fragment">Doesn't Work! Need to use the same lock for all conflicts.</p>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<p><b>Idea 2:</b> Organize locks hierarchically. Set a flag in the parent when a child is locked.</p>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<h3>New Lock Modes</h3>
|
||||
<dl>
|
||||
<dt>Exclusive (X)</dt>
|
||||
<dd>The holding thread can safely modify the object</dd>
|
||||
<dt>Shared (S)</dt>
|
||||
<dd>A holding thread can safely read the object</dd>
|
||||
<div class="fragment">
|
||||
<dt>Intent-Exclusive (IX)</dt>
|
||||
<dd>Descendant locks may be held Exclusive</dd>
|
||||
<dt>Intent-Shared (IS)</dt>
|
||||
<dd>Descendant locks may be held Shared</dd>
|
||||
</div>
|
||||
</dl>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<p>Before acquiring a descendant lock, a thread must first intent-acquire all ancestors (top-down)
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<table style="font-size: 120%">
|
||||
<tr><td></td><td></td><td colspan=4 style="font-size: 100%; font-weight: bold;">Requested</td></tr>
|
||||
<tr><td></td><td></td>
|
||||
<td style="font-weight: bold;">IS</td>
|
||||
<td style="font-weight: bold;">IX</td>
|
||||
<td style="font-weight: bold;">S</td>
|
||||
<td style="font-weight: bold;">X</td>
|
||||
</tr>
|
||||
<tr><td rowspan=5 style="font-size: 100%; font-weight: bold; vertical-align: middle;">H<br/>e<br/>l<br/>d</td>
|
||||
<td style="font-weight: bold">None</td>
|
||||
<td style="background-color: lightblue">Allow</td>
|
||||
<td style="background-color: lightblue">Allow</td>
|
||||
<td style="background-color: lightblue">Allow</td>
|
||||
<td style="background-color: lightblue">Allow</td></tr>
|
||||
<tr><td style="font-weight: bold;">IS</td>
|
||||
<td style="background-color: lightblue">Allow</td>
|
||||
<td style="background-color: lightblue">Allow</td>
|
||||
<td style="background-color: lightblue">Allow</td>
|
||||
<td style="background-color: bisque">Block</td></tr>
|
||||
<tr><td style="font-weight: bold;">IX</td>
|
||||
<td style="background-color: lightblue">Allow</td>
|
||||
<td style="background-color: lightblue">Allow</td>
|
||||
<td style="background-color: bisque">Block</td>
|
||||
<td style="background-color: bisque">Block</td></tr>
|
||||
<tr><td style="font-weight: bold;">S</td>
|
||||
<td style="background-color: lightblue">Allow</td>
|
||||
<td style="background-color: bisque">Block</td>
|
||||
<td style="background-color: lightblue">Allow</td>
|
||||
<td style="background-color: bisque">Block</td></tr>
|
||||
<tr><td style="font-weight: bold;">X</td>
|
||||
<td style="background-color: bisque">Block</td>
|
||||
<td style="background-color: bisque">Block</td>
|
||||
<td style="background-color: bisque">Block</td>
|
||||
<td style="background-color: bisque">Block</td></tr>
|
||||
</table>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<h3>Example 1</h3>
|
||||
<svg data-src="2021-04-08/HierarchicalOK.svg"/>
|
||||
</section>
|
||||
<section>
|
||||
<h3>Example 2</h3>
|
||||
<svg data-src="2021-04-08/HierarchicalNotOK.svg"/>
|
||||
</section>
|
||||
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<section>
|
||||
<table style="font-size: 80%">
|
||||
<tr><th>Time</th><th>T1</th><th>T2</th><th>T3</th><th>T4</th></tr>
|
||||
<%
|
||||
ops = [
|
||||
{ t: 1, op: "S(A)" },
|
||||
{ t: 1, op: "R(A)" },
|
||||
{ t: 2, op: "X(B)" },
|
||||
{ t: 2, op: "W(B)" },
|
||||
{ t: 1, op: "S(B)", animate: "highlight-red" },
|
||||
{ t: 3, op: "S(C)" },
|
||||
{ t: 3, op: "R(C)" },
|
||||
{ t: 2, op: "X(C)", animate: "highlight-red" },
|
||||
{ t: 4, op: "X(B)", animate: "highlight-red" },
|
||||
{ t: 3, op: "X(A)", animate: "highlight-red" },
|
||||
]
|
||||
ops.each do |op|
|
||||
op[:bar] = "|"
|
||||
if op.has_key? :animate
|
||||
op[:op] = '<span class="fragment highlight-red">'+op[:op]+"</span>"
|
||||
end
|
||||
end
|
||||
ops[-1][:bar] = "↓"
|
||||
ops.each do |op| %>
|
||||
<tr><td><%=op[:bar]%></td>
|
||||
<% (1..4).each do |i|
|
||||
if i == op[:t] then %>
|
||||
<td><code class="fragment"><%= op[:op] %></code></td>
|
||||
<% else %>
|
||||
<td></td>
|
||||
<% end end %>
|
||||
</tr>
|
||||
<% end %>
|
||||
</table>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<h2>Deadlock</h2>
|
||||
<p>A cycle of transactions waiting on each other's locks</p>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<p class="fragment highlight-blue"><b>Approach 1</b> Detect deadlock situations as they occur and abort deadlocked transaction</p>
|
||||
<p><b>Approach 2</b> Anticipate deadlock situations before they happen</p>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<h3>The Waits-For Graph</h3>
|
||||
<dl>
|
||||
<dt>Nodes</dt>
|
||||
<dd>Every running transaction</dd>
|
||||
<dt>Directed Edges</dt>
|
||||
<dd>From a transaction blocked to the transaction it's waiting for</dd>
|
||||
</dl>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<table style="font-size: 80%; float: left">
|
||||
<tr><th>Time</th><th>T1</th><th>T2</th><th>T3</th><th>T4</th></tr>
|
||||
<% ops.each do |op| %>
|
||||
<tr><td><%=op[:bar]%></td>
|
||||
<% (1..4).each do |i|
|
||||
if i == op[:t] then %>
|
||||
<td><code><%= op[:op].gsub('<span class="fragment highlight-red">', '<span style="color: red">') %></code></td>
|
||||
<% else %>
|
||||
<td></td>
|
||||
<% end end %>
|
||||
</tr>
|
||||
<% end %>
|
||||
</table>
|
||||
<svg width="200px" height="200px" style="margin-top: 100px;">
|
||||
<defs>
|
||||
<marker
|
||||
inkscape:isstock="true"
|
||||
style="overflow:visible"
|
||||
id="marker1206"
|
||||
refX="0"
|
||||
refY="0"
|
||||
orient="auto"
|
||||
inkscape:stockid="Arrow1Lend">
|
||||
<path
|
||||
transform="matrix(-0.8,0,0,-0.8,-10,0)"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
|
||||
d="M 0,0 5,-5 -12.5,0 5,5 Z"
|
||||
id="path1204"
|
||||
inkscape:connector-curvature="0" />
|
||||
</marker>
|
||||
</defs>
|
||||
<text x="0px" y="30px">T1</text>
|
||||
<text x="150px" y="30px">T2</text>
|
||||
<text x="0px" y="200px">T4</text>
|
||||
<text x="150px" y="200px">T3</text>
|
||||
<% [
|
||||
[[ "50,18 140,18", 1]],
|
||||
[[ "170,50 170,160", 1]],
|
||||
[[ "50,160 140,40", 1]],
|
||||
[[ "140,160 50,40", 1]],
|
||||
[[ "50,18 140,18", 3],
|
||||
[ "170,50 170,160", 3],
|
||||
[ "140,160 50,40", 3]]
|
||||
].each do |g| %>
|
||||
<g class="fragment"><% g.each do |path, lw| %>
|
||||
<path
|
||||
style="fill:none;stroke:#000000;stroke-width:<%=lw%>;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker1206)"
|
||||
d="M <%=path%>"
|
||||
inkscape:connector-curvature="0" />
|
||||
<% end %></g><% end %>
|
||||
</svg>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<p>A cycle is a set of transactions that will never finish</p>
|
||||
<p class="fragment">Periodically check for cycles in the waits-for graph</p>
|
||||
<p class="fragment">Abort transactions until the cycle is broken</p>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<b>Detecting cycles is expensive!</b>
|
||||
</section>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<section>
|
||||
<p><b>Idea 2:</b> Create an order over the locks (give each a #)<br/>Only allow locks to be acquired in sequence order</p>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<table style="font-size: 70%">
|
||||
<tr><th>Time</th><th>T1</th><th>T2</th><th>T3</th><th>T4</th></tr>
|
||||
<% ops.each do |op| %>
|
||||
<tr><td><%=op[:bar]%></td>
|
||||
<% (1..4).each do |i|
|
||||
if i == op[:t] then %>
|
||||
<td><code><%= if op[:t] != 3 then op[:op].gsub('<span class="fragment highlight-red">', '<span>') else op[:op] end %></code></td>
|
||||
<% else %>
|
||||
<td></td>
|
||||
<% end end %>
|
||||
</tr>
|
||||
<% end %>
|
||||
</table>
|
||||
<p class="fragment">T3 can't acquire X(A) because it already has S(C)</p>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<p><b>Idea 2.B:</b> Acquire all locks at the start of a transaction.</p>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<p><b>Pro: </b> No deadlocks... ever.</p>
|
||||
<p><b>Pro: </b> No (expensive) cycle detection.</p>
|
||||
<p><b>Con: </b> Not all transactions are supported <br/>or transactions need to know all necessary locks in advance.</p>
|
||||
</section>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<section>
|
||||
<p><b>Idea 3:</b> False positive deadlock detections are ok</p>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<p><b>Trivial solution:</b> Timeouts</p>
|
||||
<p class="fragment">... but how long should the timeout be?</p>
|
||||
</section>
|
||||
<section>
|
||||
<p><b>Alternative:</b> Create an order over transactions<br/>Only allow a transaction to block on "older" transactions</p>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<h3>Variant 1</h3>
|
||||
<dl>
|
||||
<dt class="fragment">T1 holds a lock on A</dt>
|
||||
<dd class="fragment">T2 tries to acquire the lock on A and blocks</dd>
|
||||
<dd class="fragment">(ok, because T1 is "older")</dd>
|
||||
|
||||
<dt class="fragment">T2 holds a lock on A</dt>
|
||||
<dd class="fragment">T1 tries to acquire the lock on A</dd>
|
||||
<dd class="fragment">ABORT T1 and restart it as a "younger" transaction</dd>
|
||||
</dl>
|
||||
<p class="fragment">"Wait-Die"</p>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<h3>Variant 2</h3>
|
||||
<dl>
|
||||
<dt class="fragment">T1 holds a lock on A</dt>
|
||||
<dd class="fragment">T2 tries to acquire the lock on A and blocks</dd>
|
||||
<dd class="fragment">(ok, because T1 is "older")</dd>
|
||||
|
||||
<dt class="fragment">T2 holds a lock on A</dt>
|
||||
<dd class="fragment">T1 tries to acquire the lock on A</dd>
|
||||
<dd class="fragment">ABORT T2 and restart it at the same age.</dd>
|
||||
</dl>
|
||||
<p class="fragment">"Wait-Wound"</p>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<dl>
|
||||
<dt>Wait-Die</dt>
|
||||
<dd>Abort an older transaction that tries to wait on a younger one.</dd>
|
||||
|
||||
<dt>Wait-Wound</dt>
|
||||
<dd>If an older transaction tries to wait on a younger one, kill the younger.</dd>
|
||||
</dl>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<h3>Managing Deadlocks</h3>
|
||||
<dl>
|
||||
<dt>Approach 1: Detection</dt>
|
||||
<dd>Detect cycles (or conditions that could indicate cycles)</dd>
|
||||
<dd>Abort transactions until the cycles go away</dd>
|
||||
|
||||
|
||||
<dt>Approach 2: Recovery</dt>
|
||||
<dd>Enforce an invariant on lock acquisition order</dd>
|
||||
<dd>Acquire all locks upfront</dd>
|
||||
</dl>
|
||||
</section>
|
||||
</section>
|
136
src/teaching/cse-562/2021sp/slide/2021-04-08/2PLDepGraph.svg
Normal file
136
src/teaching/cse-562/2021sp/slide/2021-04-08/2PLDepGraph.svg
Normal file
|
@ -0,0 +1,136 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="49.325436mm"
|
||||
height="37.451424mm"
|
||||
viewBox="0 0 49.325435 37.451424"
|
||||
version="1.1"
|
||||
id="svg910"
|
||||
inkscape:version="0.92.3 (2405546, 2018-03-11)"
|
||||
sodipodi:docname="2019-04-01-2PLDepGraph.svg">
|
||||
<defs
|
||||
id="defs904">
|
||||
<marker
|
||||
inkscape:isstock="true"
|
||||
style="overflow:visible"
|
||||
id="marker1206"
|
||||
refX="0"
|
||||
refY="0"
|
||||
orient="auto"
|
||||
inkscape:stockid="Arrow1Lend">
|
||||
<path
|
||||
transform="matrix(-0.8,0,0,-0.8,-10,0)"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
|
||||
d="M 0,0 5,-5 -12.5,0 5,5 Z"
|
||||
id="path1204"
|
||||
inkscape:connector-curvature="0" />
|
||||
</marker>
|
||||
<marker
|
||||
inkscape:stockid="Arrow1Lend"
|
||||
orient="auto"
|
||||
refY="0"
|
||||
refX="0"
|
||||
id="Arrow1Lend"
|
||||
style="overflow:visible"
|
||||
inkscape:isstock="true"
|
||||
inkscape:collect="always">
|
||||
<path
|
||||
id="path931"
|
||||
d="M 0,0 5,-5 -12.5,0 5,5 Z"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
|
||||
transform="matrix(-0.8,0,0,-0.8,-10,0)"
|
||||
inkscape:connector-curvature="0" />
|
||||
</marker>
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="1.979899"
|
||||
inkscape:cx="75.31172"
|
||||
inkscape:cy="32.837877"
|
||||
inkscape:document-units="mm"
|
||||
inkscape:current-layer="layer1"
|
||||
showgrid="false"
|
||||
fit-margin-top="0"
|
||||
fit-margin-left="0"
|
||||
fit-margin-right="0"
|
||||
fit-margin-bottom="0"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1027"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1" />
|
||||
<metadata
|
||||
id="metadata907">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1"
|
||||
transform="translate(-84.635658,-51.020171)">
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1000;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
|
||||
x="84.666664"
|
||||
y="58.874992"
|
||||
id="text914"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan912"
|
||||
x="84.666664"
|
||||
y="58.874992"
|
||||
style="stroke-width:0.26458332">T1</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1000;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
|
||||
x="121.81713"
|
||||
y="58.874989"
|
||||
id="text918"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan916"
|
||||
x="121.81713"
|
||||
y="58.874989"
|
||||
style="stroke-width:0.26458332">T2</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1000;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
|
||||
x="99.445038"
|
||||
y="88.321732"
|
||||
id="text922"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan920"
|
||||
x="99.445038"
|
||||
y="88.321732"
|
||||
style="stroke-width:0.26458332">T3</tspan></text>
|
||||
<path
|
||||
style="fill:none;stroke:#000000;stroke-width:0.26499999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker1206)"
|
||||
d="M 109.71414,79.175326 126.01758,60.600094"
|
||||
id="path924"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="fill:none;stroke:#000000;stroke-width:0.26499999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
|
||||
d="M 120.80582,54.452895 H 98.355186"
|
||||
id="path926"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 4.8 KiB |
161
src/teaching/cse-562/2021sp/slide/2021-04-08/2PhaseLocking.svg
Normal file
161
src/teaching/cse-562/2021sp/slide/2021-04-08/2PhaseLocking.svg
Normal file
|
@ -0,0 +1,161 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="185.08134mm"
|
||||
height="75.127823mm"
|
||||
viewBox="0 0 185.08134 75.127823"
|
||||
version="1.1"
|
||||
id="svg8"
|
||||
inkscape:version="0.92.3 (2405546, 2018-03-11)"
|
||||
sodipodi:docname="2019-04-01-2PhaseLocking.svg">
|
||||
<defs
|
||||
id="defs2" />
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="0.90509668"
|
||||
inkscape:cx="531.08154"
|
||||
inkscape:cy="85.914308"
|
||||
inkscape:document-units="mm"
|
||||
inkscape:current-layer="g871"
|
||||
showgrid="false"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1027"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1"
|
||||
fit-margin-top="0"
|
||||
fit-margin-left="0"
|
||||
fit-margin-right="0"
|
||||
fit-margin-bottom="0" />
|
||||
<metadata
|
||||
id="metadata5">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1"
|
||||
transform="translate(2.157262,-31.668136)">
|
||||
<g
|
||||
id="g863"
|
||||
transform="translate(-0.89340272)">
|
||||
<g
|
||||
id="g848">
|
||||
<rect
|
||||
style="fill:#87decd;stroke:#800000;stroke-width:0.26499999;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
|
||||
id="rect815"
|
||||
width="51.422966"
|
||||
height="16.646688"
|
||||
x="44.601189"
|
||||
y="44.511906"
|
||||
rx="1.5987263"
|
||||
ry="1.4699826" />
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:9.92000675em;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
|
||||
x="50.605865"
|
||||
y="56.368881"
|
||||
id="text821"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan819"
|
||||
x="50.605865"
|
||||
y="56.368881"
|
||||
style="line-height:9.92000675em;stroke-width:0.26458332">Acquire</tspan></text>
|
||||
</g>
|
||||
<g
|
||||
id="g853">
|
||||
<rect
|
||||
ry="1.4699826"
|
||||
rx="1.5987263"
|
||||
y="44.511906"
|
||||
x="96.024155"
|
||||
height="16.646687"
|
||||
width="51.422974"
|
||||
id="rect817"
|
||||
style="fill:#de8787;stroke:#800000;stroke-width:0.26499999;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0" />
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:9.92000675em;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
|
||||
x="100.81702"
|
||||
y="56.368881"
|
||||
id="text825"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan823"
|
||||
x="100.81702"
|
||||
y="56.368881"
|
||||
style="line-height:9.92000675em;stroke-width:0.26458332">Release</tspan></text>
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
id="g871">
|
||||
<text
|
||||
id="text829"
|
||||
y="71.925652"
|
||||
x="89.620079"
|
||||
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
|
||||
xml:space="preserve"><tspan
|
||||
id="tspan833"
|
||||
style="font-size:7.05555534px;line-height:1;text-align:end;text-anchor:end;stroke-width:0.26458332"
|
||||
y="71.925652"
|
||||
x="91.86628"
|
||||
sodipodi:role="line">Can only be the LHS </tspan><tspan
|
||||
id="tspan837"
|
||||
style="font-size:7.05555534px;line-height:1;text-align:end;text-anchor:end;stroke-width:0.26458332"
|
||||
y="82.508987"
|
||||
x="89.620079"
|
||||
sodipodi:role="line">of a new conflict edge</tspan><tspan
|
||||
style="font-size:7.05555534px;line-height:1;text-align:end;text-anchor:end;stroke-width:0.26458332"
|
||||
y="93.092316"
|
||||
x="89.620079"
|
||||
sodipodi:role="line"
|
||||
id="tspan881">(would block otherwise)</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1;font-family:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
|
||||
x="99.266838"
|
||||
y="71.925652"
|
||||
id="text843"><tspan
|
||||
sodipodi:role="line"
|
||||
x="99.266838"
|
||||
y="71.925652"
|
||||
style="font-size:7.05555534px;line-height:1;text-align:start;text-anchor:start;stroke-width:0.26458332"
|
||||
id="tspan841">Can never create a</tspan><tspan
|
||||
sodipodi:role="line"
|
||||
x="99.266838"
|
||||
y="82.508987"
|
||||
style="font-size:7.05555534px;line-height:1;text-align:start;text-anchor:start;stroke-width:0.26458332"
|
||||
id="tspan879">new conflict edge</tspan><tspan
|
||||
sodipodi:role="line"
|
||||
x="99.266838"
|
||||
y="93.092316"
|
||||
style="font-size:7.05555534px;line-height:1;text-align:start;text-anchor:start;stroke-width:0.26458332"
|
||||
id="tspan883">(no new locks)</tspan></text>
|
||||
</g>
|
||||
<path
|
||||
style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="M 95.005963,31.668136 V 106.79596"
|
||||
id="path873"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 6.1 KiB |
196
src/teaching/cse-562/2021sp/slide/2021-04-08/DependencyCycle.svg
Normal file
196
src/teaching/cse-562/2021sp/slide/2021-04-08/DependencyCycle.svg
Normal file
|
@ -0,0 +1,196 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="54.720177mm"
|
||||
height="51.909008mm"
|
||||
viewBox="0 0 54.720177 51.909008"
|
||||
version="1.1"
|
||||
id="svg8"
|
||||
inkscape:version="0.92.3 (2405546, 2018-03-11)"
|
||||
sodipodi:docname="2019-04-01-DependencyCycle.svg">
|
||||
<defs
|
||||
id="defs2">
|
||||
<marker
|
||||
inkscape:isstock="true"
|
||||
style="overflow:visible"
|
||||
id="marker867"
|
||||
refX="0"
|
||||
refY="0"
|
||||
orient="auto"
|
||||
inkscape:stockid="Arrow1Lend">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
transform="matrix(-0.8,0,0,-0.8,-10,0)"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
|
||||
d="M 0,0 5,-5 -12.5,0 5,5 Z"
|
||||
id="path865" />
|
||||
</marker>
|
||||
<marker
|
||||
inkscape:stockid="Arrow1Lend"
|
||||
orient="auto"
|
||||
refY="0"
|
||||
refX="0"
|
||||
id="Arrow1Lend"
|
||||
style="overflow:visible"
|
||||
inkscape:isstock="true"
|
||||
inkscape:collect="always">
|
||||
<path
|
||||
id="path830"
|
||||
d="M 0,0 5,-5 -12.5,0 5,5 Z"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
|
||||
transform="matrix(-0.8,0,0,-0.8,-10,0)"
|
||||
inkscape:connector-curvature="0" />
|
||||
</marker>
|
||||
<marker
|
||||
inkscape:isstock="true"
|
||||
style="overflow:visible"
|
||||
id="marker1117"
|
||||
refX="0"
|
||||
refY="0"
|
||||
orient="auto"
|
||||
inkscape:stockid="Arrow1Lstart">
|
||||
<path
|
||||
transform="matrix(0.8,0,0,0.8,10,0)"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
|
||||
d="M 0,0 5,-5 -12.5,0 5,5 Z"
|
||||
id="path1115"
|
||||
inkscape:connector-curvature="0" />
|
||||
</marker>
|
||||
<marker
|
||||
inkscape:stockid="Arrow1Lstart"
|
||||
orient="auto"
|
||||
refY="0"
|
||||
refX="0"
|
||||
id="Arrow1Lstart"
|
||||
style="overflow:visible"
|
||||
inkscape:isstock="true"
|
||||
inkscape:collect="always">
|
||||
<path
|
||||
id="path827"
|
||||
d="M 0,0 5,-5 -12.5,0 5,5 Z"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
|
||||
transform="matrix(0.8,0,0,0.8,10,0)"
|
||||
inkscape:connector-curvature="0" />
|
||||
</marker>
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="1.4"
|
||||
inkscape:cx="-80.527164"
|
||||
inkscape:cy="20.672795"
|
||||
inkscape:document-units="mm"
|
||||
inkscape:current-layer="layer1"
|
||||
showgrid="false"
|
||||
fit-margin-top="0"
|
||||
fit-margin-left="0"
|
||||
fit-margin-right="0"
|
||||
fit-margin-bottom="0"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1027"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1" />
|
||||
<metadata
|
||||
id="metadata5">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1"
|
||||
transform="translate(-27.939232,-43.838633)">
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1000;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
|
||||
x="27.970238"
|
||||
y="82.995712"
|
||||
id="text817"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan815"
|
||||
x="27.970238"
|
||||
y="82.995712"
|
||||
style="stroke-width:0.26458332">T1</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1000;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
|
||||
x="70.303574"
|
||||
y="83.065475"
|
||||
id="text821"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan819"
|
||||
x="70.303574"
|
||||
y="83.065475"
|
||||
style="stroke-width:0.26458332">T2</tspan></text>
|
||||
<path
|
||||
style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
|
||||
d="m 75.595238,73.72945 c -12.365465,-13.437121 -25.497805,-15.754545 -39.876488,0"
|
||||
id="path823"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path825"
|
||||
d="m 75.595238,84.841955 c -13.836302,14.470732 -27.047194,14.257365 -39.876488,0"
|
||||
style="fill:none;stroke:#000000;stroke-width:0.26499999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#Arrow1Lstart)"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1000;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
|
||||
x="70.114586"
|
||||
y="67.190475"
|
||||
id="text1339"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan1337"
|
||||
x="70.114586"
|
||||
y="67.190475"
|
||||
style="font-size:7.05555534px;stroke-width:0.26458332">B</tspan></text>
|
||||
<text
|
||||
id="text1343"
|
||||
y="94.404762"
|
||||
x="53.483635"
|
||||
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1000;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
|
||||
xml:space="preserve"><tspan
|
||||
style="font-size:7.05555534px;stroke-width:0.26458332"
|
||||
y="94.404762"
|
||||
x="53.483635"
|
||||
id="tspan1341"
|
||||
sodipodi:role="line">A</tspan></text>
|
||||
<text
|
||||
id="text855"
|
||||
y="51.693451"
|
||||
x="70.303574"
|
||||
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1000;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
|
||||
xml:space="preserve"><tspan
|
||||
style="stroke-width:0.26458332"
|
||||
y="51.693451"
|
||||
x="70.303574"
|
||||
id="tspan853"
|
||||
sodipodi:role="line">T3</tspan></text>
|
||||
<path
|
||||
style="fill:none;stroke:#000000;stroke-width:0.26499999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker867)"
|
||||
d="M 75.595238,73.72945 V 54.170258"
|
||||
id="path857"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 7.1 KiB |
|
@ -0,0 +1,251 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="201.10849mm"
|
||||
height="126.47292mm"
|
||||
viewBox="0 0 201.10849 126.47292"
|
||||
version="1.1"
|
||||
id="svg8"
|
||||
inkscape:version="0.92.3 (2405546, 2018-03-11)"
|
||||
sodipodi:docname="2019-04-01-HierarchicalNotOK.svg">
|
||||
<defs
|
||||
id="defs2" />
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="0.7"
|
||||
inkscape:cx="48.991591"
|
||||
inkscape:cy="250.0477"
|
||||
inkscape:document-units="mm"
|
||||
inkscape:current-layer="layer1"
|
||||
showgrid="false"
|
||||
fit-margin-top="0"
|
||||
fit-margin-left="0"
|
||||
fit-margin-right="0"
|
||||
fit-margin-bottom="0"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1027"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1" />
|
||||
<metadata
|
||||
id="metadata5">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1"
|
||||
transform="translate(-12.820185,-29.097564)">
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1000;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
|
||||
x="100.54166"
|
||||
y="48.29166"
|
||||
id="text817"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan815"
|
||||
x="100.54166"
|
||||
y="48.29166"
|
||||
style="stroke-width:0.26458332">Table</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1000;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
|
||||
x="15.119047"
|
||||
y="95.160713"
|
||||
id="text821"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan819"
|
||||
x="15.119047"
|
||||
y="95.160713"
|
||||
style="stroke-width:0.26458332">Block1</tspan></text>
|
||||
<text
|
||||
id="text825"
|
||||
y="95.160713"
|
||||
x="73.327385"
|
||||
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1000;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
|
||||
xml:space="preserve"><tspan
|
||||
style="stroke-width:0.26458332"
|
||||
y="95.160713"
|
||||
x="73.327385"
|
||||
id="tspan823"
|
||||
sodipodi:role="line">Block2</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1000;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
|
||||
x="126.24406"
|
||||
y="95.160713"
|
||||
id="text829"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan827"
|
||||
x="126.24406"
|
||||
y="95.160713"
|
||||
style="stroke-width:0.26458332">Block3</tspan></text>
|
||||
<text
|
||||
id="text833"
|
||||
y="95.160713"
|
||||
x="179.16077"
|
||||
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1000;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
|
||||
xml:space="preserve"><tspan
|
||||
style="stroke-width:0.26458332"
|
||||
y="95.160713"
|
||||
x="179.16077"
|
||||
id="tspan831"
|
||||
sodipodi:role="line">Block4</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1000;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
|
||||
x="30.994047"
|
||||
y="153.36906"
|
||||
id="text837"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan835"
|
||||
x="30.994047"
|
||||
y="153.36906"
|
||||
style="stroke-width:0.26458332">Tuple2</tspan></text>
|
||||
<text
|
||||
id="text841"
|
||||
y="153.36906"
|
||||
x="78.619049"
|
||||
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1000;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
|
||||
xml:space="preserve"><tspan
|
||||
style="stroke-width:0.26458332"
|
||||
y="153.36906"
|
||||
x="78.619049"
|
||||
id="tspan839"
|
||||
sodipodi:role="line">Tuple3</tspan></text>
|
||||
<text
|
||||
id="text845"
|
||||
y="153.36906"
|
||||
x="126.24404"
|
||||
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1000;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
|
||||
xml:space="preserve"><tspan
|
||||
style="stroke-width:0.26458332"
|
||||
y="153.36906"
|
||||
x="126.24404"
|
||||
id="tspan843"
|
||||
sodipodi:role="line">Tuple4</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1000;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
|
||||
x="173.86908"
|
||||
y="153.36906"
|
||||
id="text849"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan847"
|
||||
x="173.86908"
|
||||
y="153.36906"
|
||||
style="stroke-width:0.26458332">Tuple5</tspan></text>
|
||||
<path
|
||||
style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="M 97.363276,82.380028 113.77083,53.96131 32.883929,82.6875"
|
||||
id="path851"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="M 142.49702,81.931546 113.77083,53.96131 196.16964,82.309524"
|
||||
id="path853"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="M 143.25297,97.050594 142.875,141.27381"
|
||||
id="path855"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="M 143.25297,97.050592 190.5,140.13988"
|
||||
id="path857"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="M 95.249999,141.65178 94.116071,97.806546 48.002976,140.89583"
|
||||
id="path859"
|
||||
inkscape:connector-curvature="0" />
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1000;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
|
||||
x="75.973213"
|
||||
y="37.708332"
|
||||
id="text863"
|
||||
class=""><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan861"
|
||||
x="75.973213"
|
||||
y="37.708332"
|
||||
style="fill:#d35f5f;stroke-width:0.26458332">T1:IX</tspan></text>
|
||||
<text
|
||||
id="text867"
|
||||
y="84.577377"
|
||||
x="61.610119"
|
||||
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1000;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
|
||||
xml:space="preserve"
|
||||
class=""><tspan
|
||||
style="fill:#d35f5f;stroke-width:0.26458332"
|
||||
y="84.577377"
|
||||
x="61.610119"
|
||||
id="tspan865"
|
||||
sodipodi:role="line">T1:IX</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1000;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
|
||||
x="12.851191"
|
||||
y="140.89583"
|
||||
id="text871"
|
||||
class=""><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan869"
|
||||
x="12.851191"
|
||||
y="140.89583"
|
||||
style="fill:#d35f5f;stroke-width:0.26458332">T1:X</tspan></text>
|
||||
<text
|
||||
id="text875"
|
||||
y="36.952381"
|
||||
x="117.92857"
|
||||
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1000;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#6600ff;fill-opacity:1;stroke:none;stroke-width:0.26458332"
|
||||
xml:space="preserve"
|
||||
class="fragment"><tspan
|
||||
style="fill:#6600ff;stroke-width:0.26458332"
|
||||
y="36.952381"
|
||||
x="117.92857"
|
||||
id="tspan873"
|
||||
sodipodi:role="line">T2:IS</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1000;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#6600ff;fill-opacity:1;stroke:none;stroke-width:0.26458332"
|
||||
x="100.91965"
|
||||
y="84.577385"
|
||||
id="text879"
|
||||
class="fragment"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan877"
|
||||
x="100.91965"
|
||||
y="84.577385"
|
||||
style="fill:#6600ff;stroke-width:0.26458332">T2:S</tspan></text>
|
||||
<path
|
||||
style="fill:none;stroke:#aa0000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="M 97.363274,80.792526 H 127.72494"
|
||||
id="path949"
|
||||
inkscape:connector-curvature="0"
|
||||
class="fragment" />
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 10 KiB |
257
src/teaching/cse-562/2021sp/slide/2021-04-08/HierarchicalOK.svg
Normal file
257
src/teaching/cse-562/2021sp/slide/2021-04-08/HierarchicalOK.svg
Normal file
|
@ -0,0 +1,257 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="201.10849mm"
|
||||
height="126.47292mm"
|
||||
viewBox="0 0 201.10849 126.47292"
|
||||
version="1.1"
|
||||
id="svg8"
|
||||
inkscape:version="0.92.3 (2405546, 2018-03-11)"
|
||||
sodipodi:docname="2019-04-01-HierarchicalOK.svg">
|
||||
<defs
|
||||
id="defs2" />
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="0.7"
|
||||
inkscape:cx="48.991591"
|
||||
inkscape:cy="250.0477"
|
||||
inkscape:document-units="mm"
|
||||
inkscape:current-layer="layer1"
|
||||
showgrid="false"
|
||||
fit-margin-top="0"
|
||||
fit-margin-left="0"
|
||||
fit-margin-right="0"
|
||||
fit-margin-bottom="0"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1027"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1" />
|
||||
<metadata
|
||||
id="metadata5">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1"
|
||||
transform="translate(-12.820185,-29.097564)">
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1000;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
|
||||
x="100.54166"
|
||||
y="48.29166"
|
||||
id="text817"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan815"
|
||||
x="100.54166"
|
||||
y="48.29166"
|
||||
style="stroke-width:0.26458332">Table</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1000;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
|
||||
x="15.119047"
|
||||
y="95.160713"
|
||||
id="text821"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan819"
|
||||
x="15.119047"
|
||||
y="95.160713"
|
||||
style="stroke-width:0.26458332">Block1</tspan></text>
|
||||
<text
|
||||
id="text825"
|
||||
y="95.160713"
|
||||
x="73.327385"
|
||||
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1000;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
|
||||
xml:space="preserve"><tspan
|
||||
style="stroke-width:0.26458332"
|
||||
y="95.160713"
|
||||
x="73.327385"
|
||||
id="tspan823"
|
||||
sodipodi:role="line">Block2</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1000;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
|
||||
x="126.24406"
|
||||
y="95.160713"
|
||||
id="text829"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan827"
|
||||
x="126.24406"
|
||||
y="95.160713"
|
||||
style="stroke-width:0.26458332">Block3</tspan></text>
|
||||
<text
|
||||
id="text833"
|
||||
y="95.160713"
|
||||
x="179.16077"
|
||||
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1000;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
|
||||
xml:space="preserve"><tspan
|
||||
style="stroke-width:0.26458332"
|
||||
y="95.160713"
|
||||
x="179.16077"
|
||||
id="tspan831"
|
||||
sodipodi:role="line">Block4</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1000;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
|
||||
x="30.994047"
|
||||
y="153.36906"
|
||||
id="text837"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan835"
|
||||
x="30.994047"
|
||||
y="153.36906"
|
||||
style="stroke-width:0.26458332">Tuple2</tspan></text>
|
||||
<text
|
||||
id="text841"
|
||||
y="153.36906"
|
||||
x="78.619049"
|
||||
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1000;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
|
||||
xml:space="preserve"><tspan
|
||||
style="stroke-width:0.26458332"
|
||||
y="153.36906"
|
||||
x="78.619049"
|
||||
id="tspan839"
|
||||
sodipodi:role="line">Tuple3</tspan></text>
|
||||
<text
|
||||
id="text845"
|
||||
y="153.36906"
|
||||
x="126.24404"
|
||||
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1000;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
|
||||
xml:space="preserve"><tspan
|
||||
style="stroke-width:0.26458332"
|
||||
y="153.36906"
|
||||
x="126.24404"
|
||||
id="tspan843"
|
||||
sodipodi:role="line">Tuple4</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1000;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
|
||||
x="173.86908"
|
||||
y="153.36906"
|
||||
id="text849"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan847"
|
||||
x="173.86908"
|
||||
y="153.36906"
|
||||
style="stroke-width:0.26458332">Tuple5</tspan></text>
|
||||
<path
|
||||
style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="M 97.363276,82.380028 113.77083,53.96131 32.883929,82.6875"
|
||||
id="path851"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="M 142.49702,81.931546 113.77083,53.96131 196.16964,82.309524"
|
||||
id="path853"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="M 143.25297,97.050594 142.875,141.27381"
|
||||
id="path855"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="M 143.25297,97.050592 190.5,140.13988"
|
||||
id="path857"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="M 95.249999,141.65178 94.116071,97.806546 48.002976,140.89583"
|
||||
id="path859"
|
||||
inkscape:connector-curvature="0" />
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1000;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
|
||||
x="75.973213"
|
||||
y="37.708332"
|
||||
id="text863"
|
||||
class="fragment"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan861"
|
||||
x="75.973213"
|
||||
y="37.708332"
|
||||
style="fill:#d35f5f;stroke-width:0.26458332">T1:IX</tspan></text>
|
||||
<text
|
||||
id="text867"
|
||||
y="84.577377"
|
||||
x="61.610119"
|
||||
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1000;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
|
||||
xml:space="preserve"
|
||||
class="fragment"><tspan
|
||||
style="fill:#d35f5f;stroke-width:0.26458332"
|
||||
y="84.577377"
|
||||
x="61.610119"
|
||||
id="tspan865"
|
||||
sodipodi:role="line">T1:IX</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1000;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
|
||||
x="12.851191"
|
||||
y="140.89583"
|
||||
id="text871"
|
||||
class="fragment"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan869"
|
||||
x="12.851191"
|
||||
y="140.89583"
|
||||
style="fill:#d35f5f;stroke-width:0.26458332">T1:X</tspan></text>
|
||||
<text
|
||||
id="text875"
|
||||
y="36.952381"
|
||||
x="117.92857"
|
||||
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1000;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#6600ff;fill-opacity:1;stroke:none;stroke-width:0.26458332"
|
||||
xml:space="preserve"
|
||||
class="fragment"><tspan
|
||||
style="fill:#6600ff;stroke-width:0.26458332"
|
||||
y="36.952381"
|
||||
x="117.92857"
|
||||
id="tspan873"
|
||||
sodipodi:role="line">T2:IX</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1000;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#6600ff;fill-opacity:1;stroke:none;stroke-width:0.26458332"
|
||||
x="100.91965"
|
||||
y="84.577385"
|
||||
id="text879"
|
||||
class="fragment"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan877"
|
||||
x="100.91965"
|
||||
y="84.577385"
|
||||
style="fill:#6600ff;stroke-width:0.26458332">T2:IX</tspan></text>
|
||||
<text
|
||||
id="text883"
|
||||
y="141.65179"
|
||||
x="100.54167"
|
||||
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1000;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#6600ff;fill-opacity:1;stroke:none;stroke-width:0.26458332"
|
||||
xml:space="preserve"
|
||||
class="fragment"><tspan
|
||||
style="fill:#6600ff;stroke-width:0.26458332"
|
||||
y="141.65179"
|
||||
x="100.54167"
|
||||
id="tspan881"
|
||||
sodipodi:role="line">T2:X</tspan></text>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 10 KiB |
Loading…
Reference in a new issue