From 780b92ada9afcf1d58085a83a0b9e6bc982203d1 Mon Sep 17 00:00:00 2001 From: Lorry Tar Creator Date: Tue, 17 Feb 2015 17:25:57 +0000 Subject: Imported from /home/lorry/working-area/delta_berkeleydb/db-6.1.23.tar.gz. --- docs/programmer_reference/transapp_nested.html | 112 ++++++++++++++----------- 1 file changed, 65 insertions(+), 47 deletions(-) (limited to 'docs/programmer_reference/transapp_nested.html') diff --git a/docs/programmer_reference/transapp_nested.html b/docs/programmer_reference/transapp_nested.html index 0312ae47..61765982 100644 --- a/docs/programmer_reference/transapp_nested.html +++ b/docs/programmer_reference/transapp_nested.html @@ -14,7 +14,7 @@ -

Berkeley DB provides support for nested transactions. Nested transactions -allow an application to decompose a large or long-running transaction -into smaller units that may be independently aborted.

-

Normally, when beginning a transaction, the application will pass a NULL -value for the parent argument to DB_ENV->txn_begin(). If, however, the -parent argument is a TXN handle, the newly created transaction -will be treated as a nested transaction within the parent. Transactions -may nest arbitrarily deeply. For the purposes of this discussion, -transactions created with a parent identifier will be called -child transactions.

-

Once a transaction becomes a parent, as long as any of its child -transactions are unresolved (that is, they have neither committed nor -aborted), the parent may not issue any Berkeley DB calls except to begin more -child transactions, or to commit or abort. For example, it may not -issue any access method or cursor calls. After all of a parent's -children have committed or aborted, the parent may again request -operations on its own behalf.

-

The semantics of nested transactions are as follows. When a child -transaction is begun, it inherits all the locks of its parent. This -means that the child will never block waiting on a lock held by its -parent. Further, locks held by two children of the same parent will -also conflict. To make this concrete, consider the following set of -transactions and lock acquisitions.

-

Transaction T1 is the parent transaction. It acquires a write lock on -item A and then begins two child transactions: C1 and C2. C1 also wants -to acquire a write lock on A; this succeeds. If C2 attempts to acquire -a write lock on A, it will block until C1 releases the lock, at which -point it will succeed. Now, let's say that C1 acquires a write lock on -B. If C2 now attempts to obtain a lock on B, it will block. However, -let's now assume that C1 commits. Its locks are anti-inherited, which -means they are given to T1, so T1 will now hold a lock on B. At this -point, C2 would be unblocked and would then acquire a lock on B.

-

Child transactions are entirely subservient to their parent transaction. -They may abort, undoing their operations regardless of the eventual fate -of the parent. However, even if a child transaction commits, if its -parent transaction is eventually aborted, the child's changes are undone -and the child's transaction is effectively aborted. Any child -transactions that are not yet resolved when the parent commits or aborts -are resolved based on the parent's resolution -- committing if the -parent commits and aborting if the parent aborts. Any child -transactions that are not yet resolved when the parent prepares are also -prepared.

+

+ Berkeley DB provides support for nested transactions. Nested + transactions allow an application to decompose a large or + long-running transaction into smaller units that may be + independently aborted. +

+

+ Normally, when beginning a transaction, the application will + pass a NULL value for the parent argument to DB_ENV->txn_begin(). If, + however, the parent argument is a TXN handle, the newly + created transaction will be treated as a nested transaction + within the parent. Transactions may nest arbitrarily deeply. + For the purposes of this discussion, transactions created with + a parent identifier will be called child + transactions. +

+

+ Once a transaction becomes a parent, as long as any of its + child transactions are unresolved (that is, they have neither + committed nor aborted), the parent may not issue any Berkeley + DB calls except to begin more child transactions, or to commit + or abort. For example, it may not issue any access method or + cursor calls. After all of a parent's children have committed + or aborted, the parent may again request operations on its own + behalf. +

+

+ The semantics of nested transactions are as follows. When a + child transaction is begun, it inherits all the locks of its + parent. This means that the child will never block waiting on + a lock held by its parent. Further, locks held by two children + of the same parent will also conflict. To make this concrete, + consider the following set of transactions and lock + acquisitions. +

+

+ Transaction T1 is the parent transaction. It acquires a + write lock on item A and then begins two child transactions: + C1 and C2. C1 also wants to acquire a write lock on A; this + succeeds. If C2 attempts to acquire a write lock on A, it will + block until C1 releases the lock, at which point it will + succeed. Now, let's say that C1 acquires a write lock on B. If + C2 now attempts to obtain a lock on B, it will block. However, + let's now assume that C1 commits. Its locks are + anti-inherited, which means they are given to T1, so T1 will + now hold a lock on B. At this point, C2 would be unblocked and + would then acquire a lock on B. +

+

+ Child transactions are entirely subservient to their parent + transaction. They may abort, undoing their operations + regardless of the eventual fate of the parent. However, even + if a child transaction commits, if its parent transaction is + eventually aborted, the child's changes are undone and the + child's transaction is effectively aborted. Any child + transactions that are not yet resolved when the parent commits + or aborts are resolved based on the parent's resolution -- + committing if the parent commits and aborting if the parent + aborts. Any child transactions that are not yet resolved when + the parent prepares are also prepared. +

-- cgit v1.2.1