Oracle9i OLAP Developer's Guide to the OLAP API Release 2 (9.2) Part Number A95297-01 |
|
Using a TransactionProvider, 2 of 3
The Oracle OLAP API is transactional. Each step in creating a query occurs in the context of a Transaction
. One of the first actions of an OLAP API application is to create a TransactionProvider
. The TransactionProvider
provides Transaction
objects to the application.
The TransactionProvider
ensures the following:
Transaction
is isolated from other Transaction
objects. Operations performed in a Transaction
are not visible in, and do not affect, other Transaction
objects.Transaction
fails, its effects are undone (the Transaction
is rolled back).Transaction
persist.When you create a derived Source
by calling a method on another Source
, that Source
is created in the context of the current Transaction
. The Source
is active in the Transaction
in which you create it or in a child Transaction
of that Transaction
.
You get or set the current Transaction
, or begin a child Transaction
, by calling methods on a TransactionProvider
. In a child Transaction
you can change the state of a Template
that you created in the parent Transaction
. By displaying the data specified by the Source
produced by the Template
in the parent Transaction
and also displaying the data specified by the Source
produced by the Template
in the child Transaction
, you can provide the end user of your application with the means of performing what-if analysis.
The OLAP API has the following two types of Transaction
objects:
Transaction
. Initially, the current Transaction
is a read Transaction
. A read Transaction
is required for creating a Cursor
to fetch data from Oracle OLAP. For more information on Cursor
objects, see Chapter 9.Transaction
. A write Transaction
is required for creating a derived Source
or for changing the state of a Template
. For more information on creating a derived Source
, see Chapter 5. For information on Template
objects, see Chapter 10.In the initial read Transaction
, if you create a derived Source
or if you change the state of a Template
object, then a child write Transaction
is automatically generated. That child Transaction
becomes the current Transaction
.
If you then create another derived Source
or change the Template
state again, that operation occurs in the same write Transaction
. You can create any number of derived Source
objects, or make any number of Template
state changes, in that same write Transaction
. You can use those Source
objects, or the Source
produced by the Template
, to define a complex query.
Before you can create a Cursor
to fetch the result set specified by a derived Source
, you must move the Source
from the child write Transaction
into the parent read Transaction
. To do so, you prepare and commit the Transaction
.
To move a Source
that you created in a child Transaction
into the parent read Transaction
, call the prepareCurrentTransaction
and commitCurrentTransaction
methods on the TransactionProvider
. When you commit a child write Transaction
, a Source
you created in the child Transaction
moves into the parent read Transaction
. The child Transaction
disappears and the parent Transaction
becomes the current Transaction
. The Source
is active in the current read Transaction
and you can therefore create a Cursor
for it.
The following figure illustrates the process of moving a Source
created in a child write Transaction
into its parent read Transaction
.
Getting and setting the current Transaction
, beginning a child Transaction
, and rolling back a Transaction
are operations that you use to allow an end user to make different selections starting from a given state of a dynamic query. This creating of alternatives based on an initial state is known as what-if analysis.
To present the end user with alternatives based on the same initial query, you do the following:
Template
in a parent Transaction
and set the initial state for the Template
.Source
produced by the Template
, create a Cursor
to retrieve the result set, get the values from the Cursor
, and then display the results to the end user.Transaction
and modify the state of the Template
.Source
produced by the Template
in the child Transaction
, create a Cursor
, get the values, and display them.You can then replace the first Template
state with the second one or discard the second one and retain the first.
To begin a child read Transaction
, call the beginSubtransaction
method on the TransactionProvider
you are using. If you then change the state of a Template
, a child write Transaction
begins automatically. The write Transaction
is a child of the child read Transaction
.
To get the data specified by the Source
produced by the Template
, you prepare and commit the write Transaction
into its parent read Transaction
. You can then create a Cursor
to fetch the data. The changed state of the Template
is not visible in the original parent. The changed state does not become visible in the parent until you prepare and commit the child read Transaction
into the parent read Transaction
.
The following figure illustrates beginning a child read Transaction
, creating Source
objects in a write Transaction
,and committing the write Transaction
into its parent read Transaction
. The figure then shows committing the child read Transaction
into its parent read Transaction
. In the figure, tp
is the TransactionProvider
.
After beginning a child read Transaction
, you can begin a child read Transaction
of that child, or a grandchild of the initial parent Transaction
. For an example of creating child and grandchild Transaction
objects, see Example 7-2.
You roll back, or undo, a Transaction
by calling the rollbackCurrentTransaction
method on the TransactionProvider
you are using. Rolling back a Transaction
discards any changes that you made during that Transaction
and makes the Transaction
disappear.
Before rolling back a Transaction
, you must close any CursorManager
objects you created in that Transaction
. After rolling back a Transaction
, any Source
objects that you created or Template
state changes that you made in the Transaction
are no longer valid. Any Cursor
objects you created for those Source
objects are also invalid.
Once you roll back a Transaction
, you cannot prepare and commit that Transaction
. Likewise, once you commit a Transaction
, you cannot roll it back.
The following example creates a TopBottomTemplate
and sets its state. The example begins a child Transaction
that sets a different state for the TopBottomTemplate
and then rolls back the child Transaction
. The TransactionProvider
is tp
.
// The current Transaction is a read Transaction, t1. // Create a TopBottomTemplate using product as the base // and dp as the DataProvider. TopBottomTemplate topNBottom = new TopBottomTemplate(product, dp); // Changing the state of a Template requires a write Transaction, so a // write child Transaction, t2, is automatically started. topNBottom.setTopBottomType(TopBottomTemplate.TOP_BOTTOM_TYPE_TOP); topNBottom.setN(10); topNBottom.setCriterion(singleSelections.getSource()); // Prepare and commit the Transaction t2. tp.prepareCurrentTransaction(); tp.commitCurrentTransaction(); //t2 disappears // The current Transaction is now t1. // Create a Cursor and display the results (operations not shown). // Start a child Transaction, t3. It is a read Transaction. tp.beginSubtransaction(); // t3 is the current Transaction // Change the state of topNBottom. Changing the state requires a // write Transaction so Transaction t4 starts automatically, topNBottom.setTopBottomType(TopBottomTemplate.TOP_BOTTOM_TYPE_BOTTOM); topNBottom.setN(15); // Prepare and commit the Transaction. tp.prepareCurrentTransaction(); tp.commitCurrentTransaction(); // t4 disappears // Create a Cursor and display the results. // t3 is the current Transaction // Close the CursorManager for the Cursor created in t3. // Undo t3, which discards the state of topNBottom that was set in t4. tp.rollbackCurrentTransaction() // t3 disappears // Transaction t1 is now the current Transaction and the state of // topNBottom is the one defined in t2.
You get the current Transaction
by calling the getCurrentTransaction
method on the TransactionProvider
you are using, as in the following example.
Transaction t1 = getCurrentTransaction();
To make a previously saved Transaction
the current Transaction
, you call the setCurrentTransaction
method on the TransactionProvider
, as in the following example.
setCurrentTransaction(
t1);
|
Copyright © 2000, 2002 Oracle Corporation. All Rights Reserved. |
|