When using transactions with dbstl, you must call the dbstl
transaction functions instead of the corresponding methods
from the Berkeley DB C or C++ transaction API. That is, you
must use dbstl::begin_txn()
,
dbstl::commit_txn()
and
dbstl::abort_txn()
in order to
begin/commit/abort transactions.
A container can be configured to use auto commit by setting the DB_AUTO_COMMIT flag when the environment or database handle is opened. In this case, any container method that supports auto commit will automatically form an independent transaction if the method is not in an external transactional context; Otherwise, the operation will become part of that transaction.
You can configure the flags used internally by dbstl when
it is creating and committing these independent transactions
required by auto commit. To do so, use the
db_container::set_txn_begin_flags()
and/or
db_container::set_commit_flags()
methods.
When a transaction is committed or aborted, dbstl will automatically close any cursors opened for use by the transaction. For this reason, any iterators opened within the transaction context should not be used after the transaction commits or aborts.
You can use nested transactions explicitly and externally,
by calling dbstl::begin_txn()
in a
context already operating under the protection of a
transaction. But you can not designate which transaction is
the parent transaction. The parent transaction is
automatically the most recently created and unresolved
transaction in current thread.
It is also acceptable to use explicit transactions in a container configured for auto commit. The operation performed by the method will become part of the provided external transaction.
Finally, transactions and iterators cannot be shared among multiple threads. That is, they are not free-threaded, or thread-safe.