Annotation of embedaddon/sqlite3/ext/async/README.txt, revision 1.1.1.1

1.1       misho       1: 
                      2: Normally, when SQLite writes to a database file, it waits until the write
                      3: operation is finished before returning control to the calling application.
                      4: Since writing to the file-system is usually very slow compared with CPU
                      5: bound operations, this can be a performance bottleneck. This directory
                      6: contains an extension that causes SQLite to perform all write requests
                      7: using a separate thread running in the background. Although this does not
                      8: reduce the overall system resources (CPU, disk bandwidth etc.) at all, it
                      9: allows SQLite to return control to the caller quickly even when writing to
                     10: the database, eliminating the bottleneck.
                     11: 
                     12:   1. Functionality
                     13: 
                     14:     1.1 How it Works
                     15:     1.2 Limitations
                     16:     1.3 Locking and Concurrency
                     17: 
                     18:   2. Compilation and Usage
                     19: 
                     20:   3. Porting
                     21: 
                     22: 
                     23: 
                     24: 1. FUNCTIONALITY
                     25: 
                     26:   With asynchronous I/O, write requests are handled by a separate thread
                     27:   running in the background.  This means that the thread that initiates
                     28:   a database write does not have to wait for (sometimes slow) disk I/O
                     29:   to occur.  The write seems to happen very quickly, though in reality
                     30:   it is happening at its usual slow pace in the background.
                     31: 
                     32:   Asynchronous I/O appears to give better responsiveness, but at a price.
                     33:   You lose the Durable property.  With the default I/O backend of SQLite,
                     34:   once a write completes, you know that the information you wrote is
                     35:   safely on disk.  With the asynchronous I/O, this is not the case.  If
                     36:   your program crashes or if a power loss occurs after the database
                     37:   write but before the asynchronous write thread has completed, then the
                     38:   database change might never make it to disk and the next user of the
                     39:   database might not see your change.
                     40: 
                     41:   You lose Durability with asynchronous I/O, but you still retain the
                     42:   other parts of ACID:  Atomic,  Consistent, and Isolated.  Many
                     43:   appliations get along fine without the Durablity.
                     44: 
                     45:   1.1 How it Works
                     46: 
                     47:     Asynchronous I/O works by creating a special SQLite "vfs" structure
                     48:     and registering it with sqlite3_vfs_register(). When files opened via 
                     49:     this vfs are written to (using the vfs xWrite() method), the data is not 
                     50:     written directly to disk, but is placed in the "write-queue" to be
                     51:     handled by the background thread.
                     52: 
                     53:     When files opened with the asynchronous vfs are read from 
                     54:     (using the vfs xRead() method), the data is read from the file on 
                     55:     disk and the write-queue, so that from the point of view of
                     56:     the vfs reader the xWrite() appears to have already completed.
                     57: 
                     58:     The special vfs is registered (and unregistered) by calls to the 
                     59:     API functions sqlite3async_initialize() and sqlite3async_shutdown().
                     60:     See section "Compilation and Usage" below for details.
                     61: 
                     62:   1.2 Limitations
                     63: 
                     64:     In order to gain experience with the main ideas surrounding asynchronous 
                     65:     IO, this implementation is deliberately kept simple. Additional 
                     66:     capabilities may be added in the future.
                     67: 
                     68:     For example, as currently implemented, if writes are happening at a 
                     69:     steady stream that exceeds the I/O capability of the background writer
                     70:     thread, the queue of pending write operations will grow without bound.
                     71:     If this goes on for long enough, the host system could run out of memory. 
                     72:     A more sophisticated module could to keep track of the quantity of 
                     73:     pending writes and stop accepting new write requests when the queue of 
                     74:     pending writes grows too large.
                     75: 
                     76:   1.3 Locking and Concurrency
                     77: 
                     78:     Multiple connections from within a single process that use this
                     79:     implementation of asynchronous IO may access a single database
                     80:     file concurrently. From the point of view of the user, if all
                     81:     connections are from within a single process, there is no difference
                     82:     between the concurrency offered by "normal" SQLite and SQLite
                     83:     using the asynchronous backend.
                     84: 
                     85:     If file-locking is enabled (it is enabled by default), then connections
                     86:     from multiple processes may also read and write the database file.
                     87:     However concurrency is reduced as follows:
                     88: 
                     89:       * When a connection using asynchronous IO begins a database
                     90:         transaction, the database is locked immediately. However the
                     91:         lock is not released until after all relevant operations
                     92:         in the write-queue have been flushed to disk. This means
                     93:         (for example) that the database may remain locked for some 
                     94:         time after a "COMMIT" or "ROLLBACK" is issued.
                     95: 
                     96:       * If an application using asynchronous IO executes transactions
                     97:         in quick succession, other database users may be effectively
                     98:         locked out of the database. This is because when a BEGIN
                     99:         is executed, a database lock is established immediately. But
                    100:         when the corresponding COMMIT or ROLLBACK occurs, the lock
                    101:         is not released until the relevant part of the write-queue 
                    102:         has been flushed through. As a result, if a COMMIT is followed
                    103:         by a BEGIN before the write-queue is flushed through, the database 
                    104:         is never unlocked,preventing other processes from accessing 
                    105:         the database.
                    106: 
                    107:     File-locking may be disabled at runtime using the sqlite3async_control()
                    108:     API (see below). This may improve performance when an NFS or other 
                    109:     network file-system, as the synchronous round-trips to the server be 
                    110:     required to establish file locks are avoided. However, if multiple 
                    111:     connections attempt to access the same database file when file-locking
                    112:     is disabled, application crashes and database corruption is a likely
                    113:     outcome.
                    114: 
                    115: 
                    116: 2. COMPILATION AND USAGE
                    117: 
                    118:   The asynchronous IO extension consists of a single file of C code
                    119:   (sqlite3async.c), and a header file (sqlite3async.h) that defines the 
                    120:   C API used by applications to activate and control the modules 
                    121:   functionality.
                    122: 
                    123:   To use the asynchronous IO extension, compile sqlite3async.c as
                    124:   part of the application that uses SQLite. Then use the API defined
                    125:   in sqlite3async.h to initialize and configure the module.
                    126: 
                    127:   The asynchronous IO VFS API is described in detail in comments in 
                    128:   sqlite3async.h. Using the API usually consists of the following steps:
                    129: 
                    130:     1. Register the asynchronous IO VFS with SQLite by calling the
                    131:        sqlite3async_initialize() function.
                    132: 
                    133:     2. Create a background thread to perform write operations and call
                    134:        sqlite3async_run().
                    135: 
                    136:     3. Use the normal SQLite API to read and write to databases via 
                    137:        the asynchronous IO VFS.
                    138: 
                    139:   Refer to sqlite3async.h for details.
                    140: 
                    141: 
                    142: 3. PORTING
                    143: 
                    144:   Currently the asynchronous IO extension is compatible with win32 systems
                    145:   and systems that support the pthreads interface, including Mac OSX, Linux, 
                    146:   and other varieties of Unix. 
                    147: 
                    148:   To port the asynchronous IO extension to another platform, the user must
                    149:   implement mutex and condition variable primitives for the new platform.
                    150:   Currently there is no externally available interface to allow this, but
                    151:   modifying the code within sqlite3async.c to include the new platforms
                    152:   concurrency primitives is relatively easy. Search within sqlite3async.c
                    153:   for the comment string "PORTING FUNCTIONS" for details. Then implement
                    154:   new versions of each of the following:
                    155: 
                    156:     static void async_mutex_enter(int eMutex);
                    157:     static void async_mutex_leave(int eMutex);
                    158:     static void async_cond_wait(int eCond, int eMutex);
                    159:     static void async_cond_signal(int eCond);
                    160:     static void async_sched_yield(void);
                    161: 
                    162:   The functionality required of each of the above functions is described
                    163:   in comments in sqlite3async.c.
                    164: 

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>