mirror of
https://github.com/berkeleydb/libdb.git
synced 2024-11-16 17:16:25 +00:00
211 lines
11 KiB
HTML
211 lines
11 KiB
HTML
|
<?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>Transaction FAQ</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="Berkeley DB Programmer's Reference Guide" />
|
|||
|
<link rel="up" href="transapp.html" title="Chapter 11. Berkeley DB Transactional Data Store Applications" />
|
|||
|
<link rel="prev" href="transapp_throughput.html" title="Transaction throughput" />
|
|||
|
<link rel="next" href="rep.html" title="Chapter 12. Berkeley DB Replication" />
|
|||
|
</head>
|
|||
|
<body>
|
|||
|
<div xmlns="" class="navheader">
|
|||
|
<div class="libver">
|
|||
|
<p>Library Version 11.2.5.2</p>
|
|||
|
</div>
|
|||
|
<table width="100%" summary="Navigation header">
|
|||
|
<tr>
|
|||
|
<th colspan="3" align="center">Transaction FAQ</th>
|
|||
|
</tr>
|
|||
|
<tr>
|
|||
|
<td width="20%" align="left"><a accesskey="p" href="transapp_throughput.html">Prev</a> </td>
|
|||
|
<th width="60%" align="center">Chapter 11.
|
|||
|
Berkeley DB Transactional Data Store Applications
|
|||
|
</th>
|
|||
|
<td width="20%" align="right"> <a accesskey="n" href="rep.html">Next</a></td>
|
|||
|
</tr>
|
|||
|
</table>
|
|||
|
<hr />
|
|||
|
</div>
|
|||
|
<div class="sect1" lang="en" xml:lang="en">
|
|||
|
<div class="titlepage">
|
|||
|
<div>
|
|||
|
<div>
|
|||
|
<h2 class="title" style="clear: both"><a id="transapp_faq"></a>Transaction FAQ</h2>
|
|||
|
</div>
|
|||
|
</div>
|
|||
|
</div>
|
|||
|
<div class="orderedlist">
|
|||
|
<ol type="1">
|
|||
|
<li>
|
|||
|
<p>
|
|||
|
<span class="bold"><strong>What should a transactional program do when an error occurs?</strong></span>
|
|||
|
</p>
|
|||
|
<p>
|
|||
|
Any time an error occurs, such that a transactionally protected
|
|||
|
set of operations cannot complete successfully, the transaction
|
|||
|
must be aborted. While deadlock is by far the most common of
|
|||
|
these errors, there are other possibilities; for example,
|
|||
|
running out of disk space for the filesystem. In Berkeley DB
|
|||
|
transactional applications, there are three classes of error
|
|||
|
returns: "expected" errors, "unexpected but recoverable"
|
|||
|
errors, and a single "unrecoverable" error. Expected errors
|
|||
|
are errors like
|
|||
|
<a class="link" href="program_errorret.html#program_errorret.DB_NOTFOUND">DB_NOTFOUND</a>,
|
|||
|
which indicates that a searched-for key item is not present in
|
|||
|
the database. Applications may want to explicitly test for and
|
|||
|
handle this error, or, in the case where the absence of a key
|
|||
|
implies the enclosing transaction should fail, simply call
|
|||
|
<a href="../api_reference/C/txnabort.html" class="olink">DB_TXN->abort()</a>. Unexpected but recoverable errors are errors like
|
|||
|
<a class="link" href="program_errorret.html#program_errorret.DB_LOCK_DEADLOCK">DB_LOCK_DEADLOCK</a>,
|
|||
|
which indicates that an operation has been selected to resolve
|
|||
|
a deadlock, or a system error such as EIO, which likely
|
|||
|
indicates that the filesystem has no available disk space.
|
|||
|
Applications must immediately call <a href="../api_reference/C/txnabort.html" class="olink">DB_TXN->abort()</a> when these
|
|||
|
returns occur, as it is not possible to proceed otherwise. The
|
|||
|
only unrecoverable error is
|
|||
|
<a class="link" href="program_errorret.html#program_errorret.DB_RUNRECOVERY">DB_RUNRECOVERY</a>,
|
|||
|
which indicates that the system must stop and recovery must be
|
|||
|
run.
|
|||
|
</p>
|
|||
|
</li>
|
|||
|
<li>
|
|||
|
<p>
|
|||
|
<span class="bold"><strong>How can hot backups work? Can't you get an
|
|||
|
inconsistent picture of the database when you copy
|
|||
|
it?</strong></span>
|
|||
|
</p>
|
|||
|
<p>
|
|||
|
First, Berkeley DB is based on the technique of "write-ahead
|
|||
|
logging", which means that before any change is made to a
|
|||
|
database, a log record is written that describes the change.
|
|||
|
Further, Berkeley DB guarantees that the log record that
|
|||
|
describes the change will always be written to stable storage
|
|||
|
(that is, disk) before the database page where the change was
|
|||
|
made is written to stable storage. Because of this guarantee,
|
|||
|
we know that any change made to a database will appear either
|
|||
|
in just a log file, or both the database and a log file, but
|
|||
|
never in just the database.
|
|||
|
</p>
|
|||
|
<p>
|
|||
|
Second, you can always create a consistent and correct database
|
|||
|
based on the log files and the databases from a database
|
|||
|
environment. So, during a hot backup, we first make a copy of
|
|||
|
the databases and then a copy of the log files. The tricky
|
|||
|
part is that there may be pages in the database that are
|
|||
|
related for which we won't get a consistent picture during this
|
|||
|
copy. For example, let's say that we copy pages 1-4 of the
|
|||
|
database, and then are swapped out. For whatever reason
|
|||
|
(perhaps because we needed to flush pages from the cache, or
|
|||
|
because of a checkpoint), the database pages 1 and 5 are
|
|||
|
written. Then, the hot backup process is re-scheduled, and it
|
|||
|
copies page 5. Obviously, we have an inconsistent database
|
|||
|
snapshot, because we have a copy of page 1 from before it was
|
|||
|
written by the other thread of control, and a copy of page 5
|
|||
|
after it was written by the other thread. What makes this work
|
|||
|
is the order of operations in a hot backup. Because of the
|
|||
|
write-ahead logging guarantees, we know that any page written
|
|||
|
to the database will first be referenced in the log. If we
|
|||
|
copy the database first, then we can also know that any
|
|||
|
inconsistency in the database will be described in the log
|
|||
|
files, and so we know that we can fix everything up during
|
|||
|
recovery.
|
|||
|
</p>
|
|||
|
</li>
|
|||
|
<li>
|
|||
|
<p>
|
|||
|
<span class="bold"><strong>My application has <a class="link" href="program_errorret.html#program_errorret.DB_LOCK_DEADLOCK">DB_LOCK_DEADLOCK</a>
|
|||
|
errors. Is the normal, and what should I do?</strong></span>
|
|||
|
</p>
|
|||
|
<p>
|
|||
|
It is quite rare for a transactional application to be deadlock
|
|||
|
free. All applications should be prepared to handle deadlock
|
|||
|
returns, because even if the application is deadlock free when
|
|||
|
deployed, future changes to the application or the Berkeley DB
|
|||
|
implementation might introduce deadlocks.
|
|||
|
</p>
|
|||
|
<p>
|
|||
|
Practices which reduce the chance of deadlock include:
|
|||
|
|
|||
|
</p>
|
|||
|
<div class="itemizedlist">
|
|||
|
<ul type="disc">
|
|||
|
<li>Not using cursors which move backwards through the database (<a href="../api_reference/C/dbcget.html#dbcget_DB_PREV" class="olink">DB_PREV</a>),
|
|||
|
as backward scanning cursors can deadlock with page splits;</li>
|
|||
|
<li>Configuring <a href="../api_reference/C/dbset_flags.html#dbset_flags_DB_REVSPLITOFF" class="olink">DB_REVSPLITOFF</a> to turn off reverse splits in
|
|||
|
applications which repeatedly delete and re-insert the same keys, to
|
|||
|
minimize the number of page splits as keys are re-inserted;</li>
|
|||
|
<li>Not configuring <a href="../api_reference/C/dbopen.html#dbopen_DB_READ_UNCOMMITTED" class="olink">DB_READ_UNCOMMITTED</a> as that flag requires write
|
|||
|
transactions upgrade their locks when aborted, which can lead to deadlock.
|
|||
|
Generally, <a href="../api_reference/C/dbcget.html#dbcget_DB_READ_COMMITTED" class="olink">DB_READ_COMMITTED</a> or non-transactional read operations
|
|||
|
are less prone to deadlock than <a href="../api_reference/C/dbopen.html#dbopen_DB_READ_UNCOMMITTED" class="olink">DB_READ_UNCOMMITTED</a>.</li>
|
|||
|
</ul>
|
|||
|
</div>
|
|||
|
<p>
|
|||
|
</p>
|
|||
|
</li>
|
|||
|
<li>
|
|||
|
<p>
|
|||
|
<span class="bold"><strong>How can I move a database from one
|
|||
|
transactional environment into another?</strong></span>
|
|||
|
</p>
|
|||
|
<p>
|
|||
|
Because database pages contain references to log records,
|
|||
|
databases cannot be simply moved into different database
|
|||
|
environments. To move a database into a different environment,
|
|||
|
dump and reload the database before moving it. If the database
|
|||
|
is too large to dump and reload, the database may be prepared
|
|||
|
in place using the <a href="../api_reference/C/envlsn_reset.html" class="olink">DB_ENV->lsn_reset()</a> method or the <span class="bold"><strong>-r</strong></span> argument to the <a href="../api_reference/C/db_load.html" class="olink">db_load</a> utility.
|
|||
|
</p>
|
|||
|
</li>
|
|||
|
<li>
|
|||
|
<p>
|
|||
|
<span class="bold"><strong>I'm seeing the error "log_flush: LSN past
|
|||
|
current end-of-log", what does that mean?</strong></span>
|
|||
|
</p>
|
|||
|
<p>
|
|||
|
The most common cause of this error is that a system
|
|||
|
administrator has removed all of the log files from a database
|
|||
|
environment. You should shut down your database environment as
|
|||
|
gracefully as possible, first flushing the database environment
|
|||
|
cache to disk, if that's possible. Then, dump and reload your
|
|||
|
databases. If the database is too large to dump and reload,
|
|||
|
the database may be reset in place using the <a href="../api_reference/C/envlsn_reset.html" class="olink">DB_ENV->lsn_reset()</a>
|
|||
|
method or the <span class="bold"><strong>-r</strong></span> argument to
|
|||
|
the <a href="../api_reference/C/db_load.html" class="olink">db_load</a> utility. However, if you reset the database in place,
|
|||
|
you should verify your databases before using them again. (It
|
|||
|
is possible for the databases to be corrupted by running after
|
|||
|
all of the log files have been removed, and the longer the
|
|||
|
application runs, the worse it can get.)
|
|||
|
</p>
|
|||
|
</li>
|
|||
|
</ol>
|
|||
|
</div>
|
|||
|
</div>
|
|||
|
<div class="navfooter">
|
|||
|
<hr />
|
|||
|
<table width="100%" summary="Navigation footer">
|
|||
|
<tr>
|
|||
|
<td width="40%" align="left"><a accesskey="p" href="transapp_throughput.html">Prev</a> </td>
|
|||
|
<td width="20%" align="center">
|
|||
|
<a accesskey="u" href="transapp.html">Up</a>
|
|||
|
</td>
|
|||
|
<td width="40%" align="right"> <a accesskey="n" href="rep.html">Next</a></td>
|
|||
|
</tr>
|
|||
|
<tr>
|
|||
|
<td width="40%" align="left" valign="top">Transaction throughput </td>
|
|||
|
<td width="20%" align="center">
|
|||
|
<a accesskey="h" href="index.html">Home</a>
|
|||
|
</td>
|
|||
|
<td width="40%" align="right" valign="top"> Chapter 12.
|
|||
|
Berkeley DB Replication
|
|||
|
</td>
|
|||
|
</tr>
|
|||
|
</table>
|
|||
|
</div>
|
|||
|
</body>
|
|||
|
</html>
|