1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Chapter 2. Locking Notes</title>
<link rel="stylesheet" href="gettingStarted.css" type="text/css" />
<meta name="generator" content="DocBook XSL Stylesheets V1.73.2" />
<link rel="start" href="index.html" title="Getting Started with the Oracle Berkeley DB SQL APIs" />
<link rel="up" href="index.html" title="Getting Started with the Oracle Berkeley DB SQL APIs" />
<link rel="prev" href="normal-sql.html" title="Differences for Users of other SQL Engines" />
<link rel="next" href="lockhandling.html" title="Lock Handling" />
</head>
<body>
<div xmlns="" class="navheader">
<div class="libver">
<p>Library Version 11.2.5.3</p>
</div>
<table width="100%" summary="Navigation header">
<tr>
<th colspan="3" align="center">Chapter 2. Locking Notes</th>
</tr>
<tr>
<td width="20%" align="left"><a accesskey="p" href="normal-sql.html">Prev</a> </td>
<th width="60%" align="center"> </th>
<td width="20%" align="right"> <a accesskey="n" href="lockhandling.html">Next</a></td>
</tr>
</table>
<hr />
</div>
<div class="chapter" lang="en" xml:lang="en">
<div class="titlepage">
<div>
<div>
<h2 class="title"><a id="lockingnotes"></a>Chapter 2. Locking Notes</h2>
</div>
</div>
</div>
<div class="toc">
<p>
<b>Table of Contents</b>
</p>
<dl>
<dt>
<span class="sect1">
<a href="lockingnotes.html#dbusage">Internal Database Usage</a>
</span>
</dt>
<dt>
<span class="sect1">
<a href="lockhandling.html">Lock Handling</a>
</span>
</dt>
<dd>
<dl>
<dt>
<span class="sect2">
<a href="lockhandling.html#sqllockmodel">SQLite Lock Usage</a>
</span>
</dt>
<dt>
<span class="sect2">
<a href="lockhandling.html#bdblockusage">Lock Usage with the BDB SQL Interface</a>
</span>
</dt>
</dl>
</dd>
</dl>
</div>
<p>
There are some important performance differences between the
BDB SQL interface and SQLite, especially in a concurrent environment.
This chapter gives you enough information about how the BDB SQL interface
uses its database, as opposed to how SQLite uses its
database, in order for you to understand the difference between
the two interfaces. It then gives you some advice on how to
best approach working with the BDB SQL interface in a multi-threaded
environment.
</p>
<p>
If you are an existing user of SQLite, and you care about
improving your application performance when using the BDB SQL interface in
a concurrent situation, you should read this chapter. Existing
users of Berkeley DB may also find some interesting information in
this chapter, although it is mostly geared towards SQLite
users.
</p>
<div class="sect1" lang="en" xml:lang="en">
<div class="titlepage">
<div>
<div>
<h2 class="title" style="clear: both"><a id="dbusage"></a>Internal Database Usage</h2>
</div>
</div>
</div>
<p>
The BDB SQL interface and SQLite do different things
when it comes to locking data in their databases. In order
to provide ACID transactions, both products must prevent
concurrent access during write operations. Further, both
products prevent concurrent access by obtaining software
level locks that allow only the current holder of the lock to
perform write access to the locked data.
</p>
<p>
The difference between the two is that when SQLite
requires a lock (such as when a transaction is underway), it
locks the entire database and all tables. (This is known as
<span class="emphasis"><em>database level locking</em></span>.) The BDB SQL interface, on the
other hand, only locks the portion of the table being
operated on within the current transactional context (this is
known as <span class="emphasis"><em>page level locking</em></span>). In most
situations, this allows applications using the BDB SQL interface to
operate concurrently and so have better read/write
throughput than applications using SQLite.
This is because there is less lock contention.
</p>
<p>
By default, one Berkeley DB logical database is created within the
single database file for every SQL table that you create. Within
each such logical database, each table row is represented as a
Berkeley DB key/data pair.
</p>
<p>
This is important because the BDB SQL interface uses Berkeley DB's Transaction
Data Store product. This means that Berkeley DB does not have to
lock an entire database (all the tables within a database
file) when it acquires a lock. Instead, it locks a single
Berkeley DB database page (which usually contains a small sub-set
of rows within a single table).
</p>
<p>
The size of database pages will differ from platform to
platform (you can also manually configure this), but usually
a database page can hold multiple key/data pairs; that is,
multiple rows from a SQL table. Exactly how many table
rows fit on a database page depends on the size of your page
and the size of your table rows.
</p>
<p>
If you have an exceptionally small table, it is possible for
the entire table to fit on a single database page. In this
case, Berkeley DB is in essence forced to serialize access to the
entire table when it requires a lock for it.
</p>
<p>
Note, however, that the case of a single table fitting on a
single database page is very rare, and it in fact represents the
abnormal case. Normally tables span multiple pages and so Berkeley DB
will lock only portions of your tables. This locking behavior is
automatic and transparent to your application.
</p>
</div>
</div>
<div class="navfooter">
<hr />
<table width="100%" summary="Navigation footer">
<tr>
<td width="40%" align="left"><a accesskey="p" href="normal-sql.html">Prev</a> </td>
<td width="20%" align="center"> </td>
<td width="40%" align="right"> <a accesskey="n" href="lockhandling.html">Next</a></td>
</tr>
<tr>
<td width="40%" align="left" valign="top">Differences for Users of other SQL Engines </td>
<td width="20%" align="center">
<a accesskey="h" href="index.html">Home</a>
</td>
<td width="40%" align="right" valign="top"> Lock Handling</td>
</tr>
</table>
</div>
</body>
</html>
|