---
name: "db_txn"
section: "3db"
platform: "linux"
package: "libdb2-dev"
version: "2.4.14-1"
release: "Debian 2.1 (Slink)"
platforms: ["linux"]
url: "https://new.carta.tech/db_txn"
---

# db\_txn(3db)

DB transaction management

## NAME

db\_txn - DB transaction management

## SYNOPSIS

```
#include <db2/db.h>
int
txn_open(const char *dir,
u_int32_t flags, int mode, DB_ENV *dbenv, DB_TXNMGR **regionp);
int
txn_begin(DB_TXNMGR *txnp, DB_TXN *pid, DB_TXN **tid);
int
txn_prepare(DB_TXN *tid);
int
txn_commit(DB_TXN *tid);
int
txn_abort(DB_TXN *tid);
u_int32_t
txn_id(DB_TXN *tid);
int
txn_checkpoint(const DB_TXNMGR *txnp, u_int32_t kbyte, u_int32_t min);
int
txn_close(DB_TXNMGR *txnp);
int
txn_unlink(const char *dir, int force, DB_ENV *dbenv);
int
txn_stat(DB_TXNMGR *txnp,
DB_TXN_STAT **statp, void *(*db_malloc)(size_t));
```

## DESCRIPTION

The DB library is a family of groups of functions that provides a modular programming interface to transactions and record-oriented file access. The library includes support for transactions, locking, logging and file page caching, as well as various indexed access methods. Many of the functional groups (e.g., the file page caching functions) are useful independent of the other DB functions, although some functional groups are explicitly based on other functional groups (e.g., transactions and logging). For a general description of the DB package, see *db\_intro*(3).

This manual page describes the specific details of the DB transaction support.

The *db\_txn* functions are the library interface that provides transaction semantics. Full transaction support is provided by a collection of modules that provide interfaces to the services required for transaction processing. These services are recovery (see *db\_log*(3)), concurrency control (see *db\_lock*(3)), and the management of shared data (see *db\_mpool*(3)). Transaction semantics can be applied to the access methods described in *db\_open*(3) through function call parameters.

The model intended for transactional use (and the one that is used by the access methods) is write-ahead logging provided by *db\_log*(3) to record both before- and after-images. Locking follows a two-phase protocol, with all locks being released at transaction commit.

*txn\_open* The *txn\_open* function copies a pointer, to the transaction region identified by the **directory** *dir*, into the memory location referenced by *regionp*.

If the *dbenv* argument to *txn\_open* was initialized using *db\_appinit*, *dir* is interpreted as described by *db\_appinit*(3).

Otherwise, if *dir* is not NULL, it is interpreted relative to the current working directory of the process. If *dir* is NULL, the following environment variables are checked in order: \`\`TMPDIR'', \`\`TEMP'', and \`\`TMP''. If one of them is set, transaction region files are created relative to the directory it specifies. If none of them are set, the first possible one of the following directories is used: */var/tmp*, */usr/tmp*, */temp*, */tmp*, *C:/temp* and *C:/tmp*.

All files associated with the transaction region are created in this directory. This directory must already exist when transaction region\_open is called. If the transaction region already exists, the process must have permission to read and write the existing files. If the transaction region does not already exist, it is optionally created and initialized.

The *flags* and *mode* arguments specify how files will be opened and/or created when they don't already exist. The flags value is specified by **or**'ing together one or more of the following values:

- DB\_CREATE

  Create any underlying files, as necessary. If the files do not already exist and the DB\_CREATE flag is not specified, the call will fail.

-

  - DB\_THREAD

  Cause the DB\_TXNMGR handle returned by the *txn\_open* function to be useable by multiple threads within a single address space, i.e., to be \`\`free-threaded''.

- DB\_TXN\_NOSYNC

  On transaction commit, do not synchronously flush the log. This means that transactions exhibit the ACI (atomicity, consistency and isolation) properties, but not D (durability), i.e., database integrity will be maintained but it is possible that some number of the most recently committed transactions may be undone during recovery instead of being redone.

  The number of transactions that are potentially at risk is governed by how often the log is checkpointed (see [*db\_checkpoint*(1)](/db_checkpoint/1.md)) and how many log updates can fit on a single log page.

All files created by the transaction subsystem are created with mode *mode* (as described in [*chmod*(2)](/chmod/2.md)) and modified by the process' umask value at the time of creation (see [*umask*(2)](/umask/2.md)). The group ownership of created files is based on the system and directory defaults, and is not further specified by DB.

The transaction subsystem is configured based on the *dbenv* argument to *txn\_open*, which is a pointer to a structure of type DB\_ENV (typedef'd in \<db2/db.h\>). Applications will normally use the same DB\_ENV structure (initialized by *db\_appinit*(3)), as an argument to all of the subsystems in the DB package.

References to the DB\_ENV structure are maintained by DB, so it may not be discarded until the last close function, corresponding to an open function for which it was an argument, has returned. In order to ensure compatibility with future releases of DB, all fields of the DB\_ENV structure that are not explicitly set should be initialized to 0 before the first time the structure is used. Do this by declaring the structure external or static, or by calling the C library routine [*bzero*(3)](/bzero/3.md) or [*memset*(3)](/memset/3.md).

The fields of the DB\_ENV structure used by *txn\_open* are described below. If *dbenv* is NULL or any of its fields are set to 0, defaults appropriate for the system are used where possible.

The following fields in the DB\_ENV structure may be initialized before calling *txn\_open*:

- void \*(\*db\_errcall)(char \*db\_errpfx, char \*buffer);

  - FILE \*db\_errfile;

  - const char \*db\_errpfx;

  - int db\_verbose;

  The error fields of the DB\_ENV behave as described for *db\_appinit*(3).

- DB\_LOG \*lg\_info;

  The logging region that is being used for this transaction environment. The *lg\_info* field contains a return value from the function *log\_open*. **Logging is required for transaction environments,** **and it is an error to not specify a logging region.**

- DB\_LOCKTAB \*lk\_info;

  The locking region that is being used for this transaction environment. The *lk\_info* field contains a return value from the function *lock\_open*. If *lk\_info* is NULL, no locking is done in this transaction environment.

- u\_int32\_t tx\_max;

  The maximum number of simultaneous transactions that are supported. This bounds the size of backing files and is used to derive limits for the size of the lock region and logfiles. When there are more than *tx\_max* concurrent transactions, calls to *txn\_begin* may cause backing files to grow. If *tx\_max* is 0, a default value is used.

- int (\*tx\_recover)(DB\_LOG \*logp, DBT \*log\_rec,

  DB\_LSN \*lsnp, int redo, void \*info);\
   A function that is called by *txn\_abort* during transaction abort. This function takes five arguments:

  - logp

    A pointer to the transaction log (DB\_LOG \*).

  - log\_rec

    A log record.

  - lsnp

    A pointer to a log sequence number (DB\_LSN \*).

  - redo

    An integer value that is set to one of the following values:

    - DB\_TXN\_BACKWARD\_ROLL

      The log is being read backward to determine which transactions have been committed and which transactions were not (and should therefore be aborted during recovery).

    - DB\_TXN\_FORWARD\_ROLL

      The log is being played forward, any transaction ids encountered that have not been entered into the list referenced by *info* should be ignored.

    - DB\_TXN\_OPENFILES

      The log is being read to open all the files required to perform recovery.

    - DB\_TXN\_REDO

      Redo the operation described by the log record.

    - DB\_TXN\_UNDO

      Undo the operation described by the log record.

  - info

    An opaque pointer used to reference the list of transaction IDs encountered during recovery.

-

  If *recover* is NULL, the default is that only DB access method operations are transaction protected, and the default recover function will be used.

The *txn\_open* function returns the value of *errno* on failure and 0 on success.

*txn\_begin* The *txn\_begin* function creates a new transaction in the designated transaction manager, copying a pointer to a DB\_TXN that uniquely identifies it into the memory referenced by *tid*. If the *pid* argument is non-NULL, the new transaction is a nested transaction with the transaction indicated by *pid* as its parent.

Transactions may not span threads, i.e., each transaction must begin and end in the same thread, and each transaction may only be used by a single thread.

The *txn\_begin* function returns the value of *errno* on failure and 0 on success.

*txn\_prepare* The *txn\_prepare* function initiates the beginning of a two phase commit. In a distributed transaction environment, *db* can be used as a local transaction manager. In this case, the distributed transaction manager must send *prepare* messages to each local manager. The local manager must then issue a *txn\_prepare* and await its successful return before responding to the distributed transaction manager. Only after the distributed transaction manager receives successful responses from all of its *prepare* messages should it issue any *commit* messages.

The *txn\_prepare* function returns the value of *errno* on failure and 0 on success.

*txn\_commit* The *txn\_commit* function ends the transaction specified by the *tid* argument. If DB\_TXN\_NOSYNC was not specified, a commit log record is written and flushed to disk, as are all previously written log records. If the transaction is nested, its locks are acquired by the parent transaction, otherwise its locks are released. Any applications that require strict two-phase locking must not release any locks explicitly, leaving them all to be released by *txn\_commit*.

The *txn\_commit* function returns the value of *errno* on failure and 0 on success.

*txn\_abort* The *txn\_abort* function causes an abnormal termination of the transaction. The log is played backwards and any necessary recovery operations are initiated through the *recover* function specified to *txn\_open*. After recovery is completed, all locks held by the transaction are acquired by the parent transaction in the case of a nested transaction or released in the case of a non-nested transaction. As is the case for *txn\_commit*, applications that require strict two phase locking should not explicitly release any locks.

The *txn\_abort* function returns the value of *errno* on failure and 0 on success.

*txn\_id* The *txn\_id* function returns the unique transaction id associated with the specified transaction. Locking calls made on behalf of this transaction should use the value returned from *txn\_id* as the locker parameter to the *lock\_get* or *lock\_vec* calls.

*txn\_close* The *txn\_close* function detaches a process from the transaction environment specified by the DB\_TXNMGR pointer. All mapped regions are unmapped and any allocated resources are freed. Any uncommitted transactions are aborted.

In addition, if the *dir* argument to *txn\_open* was NULL and *dbenv* was not initialized using *db\_appinit*, all files created for this shared region will be removed, as if *txn\_unlink* were called.

When multiple threads are using the DB\_TXNMGR handle concurrently, only a single thread may call the *txn\_close* function.

The *txn\_close* function returns the value of *errno* on failure and 0 on success.

*txn\_unlink* The *txn\_unlink* function destroys the transaction region identified by the directory *dir*, removing all files used to implement the transaction region. (The directory *dir* is not removed.) If there are processes that have called *txn\_open* without calling *txn\_close* (i.e., there are processes currently using the transaction region), *txn\_unlink* will fail without further action, unless the force flag is set, in which case *txn\_unlink* will attempt to remove the transaction region files regardless of any processes still using the transaction region.

The result of attempting to forcibly destroy the region when a process has the region open is unspecified. Processes using a shared memory region maintain an open file descriptor for it. On UNIX systems, the region removal should succeed and processes that have already joined the region should continue to run in the region without change, however processes attempting to join the transaction region will either fail or attempt to create a new region. On other systems, e.g., WNT, where the [*unlink*(2)](/unlink/2.md) system call will fail if any process has an open file descriptor for the file, the region removal will fail.

In the case of catastrophic or system failure, database recovery must be performed (see [*db\_recover*(1)](/db_recover/1.md) or the DB\_RECOVER and DB\_RECOVER\_FATAL flags to *db\_appinit*(3)). Alternatively, if recovery is not required because no database state is maintained across failures, it is possible to clean up a transaction region by removing all of the files in the directory specified to the *txn\_open* function, as transaction region files are never created in any directory other than the one specified to *txn\_open*. Note, however, that this has the potential to remove files created by the other DB subsystems in this database environment.

The *txn\_unlink* function returns the value of *errno* on failure and 0 on success.

*txn\_checkpoint* The *txn\_checkpoint* function syncs the underlying memory pool, writes a checkpoint record to the log and then flushes the log.

If either *kbyte* or *min* is non-zero, the checkpoint is only done if more than *min* minutes have passed since the last checkpoint, or if more than *kbyte* kilobytes of log data have been written since the last checkpoint.

The *txn\_checkpoint* function returns the value of *errno* on failure, 0 on success, and DB\_INCOMPLETE if there were pages that needed to be written but that *memp\_sync*(3) was unable to write immediately. In this case, the *txn\_checkpoint* call should be retried.

The *txn\_checkpoint* function is the underlying function used by the [*db\_checkpoint*(1)](/db_checkpoint/1.md) utility. See the source code for the *db\_checkpoint* utility for an example of using *txn\_checkpoint* in a UNIX environment.

*txn\_stat* The *txn\_stat* function creates a statistical structure and copies a pointer to it into the user-specified memory location.

Statistical structure are created in allocated memory. If *db\_malloc* is non-NULL, it is called to allocate the memory, otherwise, the library function [*malloc*(3)](/malloc/3.md) is used. The function *db\_malloc* must match the calling conventions of the [*malloc*(3)](/malloc/3.md) library routine. Regardless, the caller is responsible for deallocating the returned memory. To deallocate the returned memory, free each returned memory pointer; pointers inside the memory do not need to be individually freed.

The transaction region statistics are stored in a structure of type DB\_TXN\_STAT (typedef'd in \<db2/db.h\>). The following DB\_TXN\_STAT fields will be filled in:

- u\_int32\_t st\_refcnt;

  The number of references to the region.\

- u\_int32\_t st\_regsize;

  The size of the region.\

- DB\_LSN st\_last\_ckp;

  The LSN of the last checkpoint.\

- DB\_LSN st\_pending\_ckp;

  The LSN of any checkpoint that is currently in progress. If *st\_pending\_ckp* is the same as *st\_last\_ckp* there is no checkpoint in progress.\

- time\_t st\_time\_ckp;

  The time the last completed checkpoint finished (as returned by [*time*(2)](/time/2.md)).\

- u\_int32\_t st\_last\_txnid;

  The last transaction ID allocated.\

- u\_int32\_t st\_maxtxns;

  The maximum number of active transactions supported by the region.\

- u\_int32\_t st\_naborts;

  The number of transactions that have aborted.\

- u\_int32\_t st\_nactive;

  The number of transactions that are currently active.\

- u\_int32\_t st\_nbegins;

  The number of transactions that have begun.\

- u\_int32\_t st\_ncommits;

  The number of transactions that have committed.\

- u\_int32\_t st\_region\_wait;

  The number of times that a thread of control was forced to wait before obtaining the region lock.\

- u\_int32\_t st\_region\_nowait;

  The number of times that a thread of control was able to obtain the region lock without waiting.\

- DB\_TXN\_ACTIVE \*st\_txnarray;

  A pointer to an array of *st\_nactive* DB\_TXN\_ACTIVE structures, describing the currently active transactions. The following fields of the DB\_TXN\_ACTIVE structure (typedef'd in \<db2/db.h\>) will be filled in:

  - u\_int32\_t txnid;

    The transaction ID as returned by *txn\_begin*(3).\

  - DB\_LSN lsn;

    The LSN of the transaction-begin record.

## TRANSACTIONS

Creating transaction protected applications using the DB access methods requires little system customization. In most cases, the default parameters to the locking, logging, memory pool, and transaction subsystems will suffice. Applications can use *db\_appinit*(3) to perform this initialization, or they may do it explicitly.

Each database operation (i.e., any call to a function underlying the handles returned by *db\_open*(3) and *db\_cursor*(3)) is normally performed on behalf of a unique locker. If multiple calls on behalf of the same locker are desired, then transactions must be used.

Once the application has initialized the DB subsystems that it is using, it may open the DB access method databases. For applications performing transactions, the databases must be opened after subsystem initialization, and cannot be opened as part of a transaction. Once the databases are opened, the application can group sets of operations into transactions, by surrounding the operations with the appropriate *txn\_begin*, *txn\_commit* and *txn\_abort* calls. Databases accessed by a transaction must not be closed during the transaction. Note, it is not necessary to transaction protect read-only transactions, unless those transactions require repeatable reads.

The DB access methods will make the appropriate calls into the lock, log and memory pool subsystems in order to guarantee that transaction semantics are applied. When the application is ready to exit, all outstanding transactions should have been committed or aborted. At this point, all open DB files should be closed. Once the DB database files are closed, the DB subsystems should be closed, either explicitly or by calling *db\_appexit*(3).

It is also possible to use the locking, logging and transaction subsystems of DB to provide transaction semantics to objects other than those described by the DB access methods. In these cases, the application will need more explicit customization of the subsystems as well as the development of appropriate data-structure-specific recovery functions.

For example, consider an application that provides transaction semantics to data stored in plain UNIX files accessed using the [*read*(2)](/read/2.md) and [*write*(2)](/write/2.md) system calls. The operations for which transaction protection is desired are bracketed by calls to *txn\_begin* and *txn\_commit*.

Before data are referenced, the application must make a call to the lock manager, *db\_lock*, for a lock of the appropriate type (e.g., read) on the object being locked. The object might be a page in the file, a byte, a range of bytes, or some key. It is up to the application to ensure that appropriate locks are acquired. Before a write is performed, the application should acquire a write lock on the object, by making an appropriate call to the lock manager, *db\_lock*. Then, the application should make a call to the log manager, *db\_log*, to record enough information to redo the operation in case of failure after commit and to undo the operation in case of abort. As discussed in the *db\_log*(3) manual page, the application is responsible for providing any necessary structure to the log record. For example, the application must understand what part of the log record is an operation code, what part identifies the file being modified, what part is redo information, and what part is undo information.

After the log message is written, the application may issue the write system call. After all requests are issued, the application may call *txn\_commit*. When *txn\_commit* returns, the caller is guaranteed that all necessary log writes have been written to disk.

At any time, the application may call *txn\_abort*, which will result in the appropriate calls to the *recover* function to restore the \`\`database'' to a consistent pre-transaction state. (The recover function must be able to either re-apply or undo the update depending on the context, for each different type of log record.)

If the application should crash, the recovery process uses the *db\_log* interface to read the log and call the *recover* function to restore the database to a consistent state.

The *txn\_prepare* function provides the core functionality to implement distributed transactions, but it does not manage the notification of distributed transaction managers. The caller is responsible for issuing *txn\_prepare* calls to all sites participating in the transaction. If all responses are positive, the caller can issue a *txn\_commit*. If any of the responses are negative, the caller should issue a *txn\_abort*. In general, the *txn\_prepare* call requires that the transaction log be flushed to disk.

## TRANSACTION ID LIMITS

The transaction ID space in Berkeley DB is 2^31, or 2 billion entries. It is possible that some environments may need to be aware of this limitation. Consider an application performing 600 transactions a second for 15 hours a day. The transaction ID space will run out in roughly 66 days:

```
2^31 / (600 * 15 * 60 * 60) = 66
```

Doing only 100 transactions a second exhausts the transaction ID space in roughly one year.

The transaction ID space is reset each time recovery is run. If you reach the end of your transaction ID space, shut down your applications and restart them after running recovery (see [*db\_recover*(1)](/db_recover/1.md) for more information). The most recently allocated transaction ID is the *st\_last\_txnid* value in the transaction statistics information, and is displayed by the [*db\_stat*(1)](/db_stat/1.md) utility.

## ENVIRONMENT VARIABLES

The following environment variables affect the execution of *db\_txn*:

- DB\_HOME

  If the *dbenv* argument to *txn\_open* was initialized using *db\_appinit*, the environment variable DB\_HOME may be used as the path of the database home for the interpretation of the *dir* argument to *txn\_open*, as described in *db\_appinit*(3).

- TMPDIR

  If the *dbenv* argument to *txn\_open* was NULL or not initialized using *db\_appinit*, the environment variable TMPDIR may be used as the directory in which to create the transaction region, as described in the *txn\_open* section above.

## ERRORS

The *txn\_open* function may fail and return *errno* for any of the errors specified for the following DB and library functions: [close(2)](/close/2.md),  db\_version(3),  [fcntl(2)](/fcntl/2.md),  [fflush(3)](/fflush/3.md),  [lseek(2)](/lseek/2.md),  [malloc(3)](/malloc/3.md),  [memcpy(3)](/memcpy/3.md),  [memset(3)](/memset/3.md),  [mmap(2)](/mmap/2.md),  [munmap(2)](/munmap/2.md),  [open(2)](/open/2.md),  [sigfillset(3)](/sigfillset/3.md),  [sigprocmask(2)](/sigprocmask/2.md),  [stat(2)](/stat/2.md),  [strcpy(3)](/strcpy/3.md),  [strdup(3)](/strdup/3.md),  [strerror(3)](/strerror/3.md),  [strlen(3)](/strlen/3.md),  [time(3)](/time/3.md),  txn\_unlink(3),  [unlink(2)](/unlink/2.md),  and [write(2)](/write/2.md).

In addition, the *txn\_open* function may fail and return *errno* for the following conditions:

- \[EINVAL\]

  An invalid flag value or parameter was specified.

  The DB\_THREAD flag was specified and spinlocks are not implemented for this architecture.

  The *dbenv* parameter was NULL.

- \[EAGAIN\]

  The shared memory region was locked and (repeatedly) unavailable.

The *txn\_begin* function may fail and return *errno* for any of the errors specified for the following DB and library functions: [fcntl(2)](/fcntl/2.md),  [fflush(3)](/fflush/3.md),  log\_put(3),  [lseek(2)](/lseek/2.md),  [malloc(3)](/malloc/3.md),  [memcpy(3)](/memcpy/3.md),  [memset(3)](/memset/3.md),  [mmap(2)](/mmap/2.md),  [munmap(2)](/munmap/2.md),  [strerror(3)](/strerror/3.md),  and [write(2)](/write/2.md).

In addition, the *txn\_begin* function may fail and return *errno* for the following conditions:

- \[ENOSPC\]

  The maximum number of concurrent transactions has been reached.

The *txn\_prepare* function may fail and return *errno* for any of the errors specified for the following DB and library functions: [fcntl(2)](/fcntl/2.md),  [fflush(3)](/fflush/3.md),  log\_flush(3),  and [strerror(3)](/strerror/3.md).

The *txn\_commit* function may fail and return *errno* for any of the errors specified for the following DB and library functions: [fcntl(2)](/fcntl/2.md),  [fflush(3)](/fflush/3.md),  lock\_vec(3),  log\_put(3),  [malloc(3)](/malloc/3.md),  [memcpy(3)](/memcpy/3.md),  and [strerror(3)](/strerror/3.md).

In addition, the *txn\_commit* function may fail and return *errno* for the following conditions:

- \[EINVAL\]

  The transaction was aborted.

The *txn\_abort* function may fail and return *errno* for any of the errors specified for the following DB and library functions: DBenv-\>tx\_recover(3),  [fcntl(2)](/fcntl/2.md),  [fflush(3)](/fflush/3.md),  lock\_vec(3),  log\_get(3),  [memset(3)](/memset/3.md),  and [strerror(3)](/strerror/3.md).

- \[EINVAL\]

  The transaction was already aborted.

The *txn\_checkpoint* function may fail and return *errno* for any of the errors specified for the following DB and library functions: [fcntl(2)](/fcntl/2.md),  [fflush(3)](/fflush/3.md),  log\_compare(3),  log\_put(3),  [malloc(3)](/malloc/3.md),  [memcpy(3)](/memcpy/3.md),  memp\_sync(3),  [memset(3)](/memset/3.md),  [strerror(3)](/strerror/3.md),  and [time(3)](/time/3.md).

- \[EINVAL\]

  An invalid flag value or parameter was specified.

The *txn\_close* function may fail and return *errno* for any of the errors specified for the following DB and library functions: [close(2)](/close/2.md),  [fcntl(2)](/fcntl/2.md),  [fflush(3)](/fflush/3.md),  log\_flush(3),  [munmap(2)](/munmap/2.md),  [strerror(3)](/strerror/3.md),  and txn\_abort(3).

The *txn\_unlink* function may fail and return *errno* for any of the errors specified for the following DB and library functions: [close(2)](/close/2.md),  [fcntl(2)](/fcntl/2.md),  [fflush(3)](/fflush/3.md),  [malloc(3)](/malloc/3.md),  [memcpy(3)](/memcpy/3.md),  [memset(3)](/memset/3.md),  [mmap(2)](/mmap/2.md),  [munmap(2)](/munmap/2.md),  [open(2)](/open/2.md),  [sigfillset(3)](/sigfillset/3.md),  [sigprocmask(2)](/sigprocmask/2.md),  [stat(2)](/stat/2.md),  [strcpy(3)](/strcpy/3.md),  [strdup(3)](/strdup/3.md),  [strerror(3)](/strerror/3.md),  [strlen(3)](/strlen/3.md),  and [unlink(2)](/unlink/2.md).

In addition, the *txn\_unlink* function may fail and return *errno* for the following conditions:

- \[EBUSY\]

  The shared memory region was in use and the force flag was not set.

The *txn\_stat* function may fail and return *errno* for any of the errors specified for the following DB and library functions: [fcntl(2)](/fcntl/2.md),  and [malloc(3)](/malloc/3.md).

## SEE ALSO

*LIBTP: Portable, Modular Transactions for UNIX*, Margo Seltzer, Michael Olson, USENIX proceedings, Winter 1992.

## BUGS

Nested transactions are not yet implemented.

[*db\_archive*(1)](/db_archive/1.md), [*db\_checkpoint*(1)](/db_checkpoint/1.md), [*db\_deadlock*(1)](/db_deadlock/1.md), [*db\_dump*(1)](/db_dump/1.md), [*db\_load*(1)](/db_load/1.md), [*db\_recover*(1)](/db_recover/1.md), [*db\_stat*(1)](/db_stat/1.md), *db\_intro*(3), *db\_appinit*(3), *db\_cursor*(3), *db\_dbm*(3), *db\_internal*(3), *db\_lock*(3), *db\_log*(3), *db\_mpool*(3), *db\_open*(3), *db\_thread*(3), *db\_txn*(3)
