| Oracle® Database Con
cepts 10g Release 1 (10.1) Part Number B10743-01 |
|
|
View PDF |
This chapter defines a transaction and describes how you can manage your work using transactions.
This chapter c ontains the following topics:
A transaction is a logical unit of work that contains one or more SQL statements. A transaction is an atomic unit. The effects of all the SQL statements in a transaction can be either all committed (applied to t he database) or all rolled back (undone from the database).
A transaction begins with the first executable SQL statement. A t
ransaction ends when it is committed or rolled back, either explicitly with a COMMIT or ROLLBACK statement
or implicitly when a DDL statement is issued.
To illustrate the concept of a transaction, consider a banking database. When a bank customer transfers money from a savings account to a checking account, the transaction can consist of three separate operations:
Decrement the savings account
Increment the checking account
Record the transaction in the transaction journal
Oracle must allow for two situations. If all three SQL statements can be performed to maintain the accounts in proper balance, the effects of the transaction can be applied to the dat abase. However, if a problem such as insufficient funds, invalid account number, or a hardware failure prevents one or two of the sta tements in the transaction from completing, the entire transaction must be rolled back so that the balance of all accounts is correct .
Figure 4-1 illustrates the banking transaction example.
A SQL statement that runs successfully is different from a committed transaction. Executing successfully means that a single statement was:
Parsed
Found to be a valid SQL construction
Run without error as an atomic unit. For examp le, all rows of a multirow update are changed.
However, until the transaction that contains the statement is committ ed, the transaction can be rolled back, and all of the changes of the statement can be undone. A statement, rather than a transaction , runs successfully.
Committing means that a user has explicitly or im
plicitly requested that the changes in the transaction be made permanent. An explicit request occurs when the user issues a COM
MIT statement. An implicit request occurs after normal termination of an application or completion of a data definition langua
ge (DDL) operation. The changes made by the SQL statement(s) of a transaction become permanent and visible to other users only after
that transaction commits. Queries that are issued after the transaction commits will see the committed changes.
You can name a
transaction using the SET TRANSACTION ... NAME statement before you start the transaction. Th
is makes it easier to monitor long-running transactions and to resolve in-doubt distributed transactions.
|
See Also: "Transaction Naming " |
If at an y time during execution a SQL statement causes an error, all effects of the statement are rolled back. The effect of the rollback is as if that statement had never been run. This operation is a statement-level rollback.
Errors discovered duri ng SQL statement execution cause statement-level rollbacks. An example of such an error is attempting to insert a du plicate value in a primary key. Single SQL statements involved in a deadlock (competition for the same data) can also cause a statement-level rollback. Errors discovered during SQL statement parsing, such as a syntax error, have not yet been run, so they do not cause a statement-level rollback.
A SQL statement that fails causes the loss only of any work it would have performed itself. It does not cause the loss of any work that preceded it in the current transaction. If the statement is a DDL statement, then the implicit c ommit that immediately preceded it is not undone.
|
|
Oracle provides a means for suspending, and later resuming, the execution of large database operations in the event of space all ocation failures. This enables an administrator to take corrective action, instead of the Oracle database server returning an error t o the user. After the error condition is corrected, the suspended operation automatically resumes.
A statement runs in a resum
able mode only when the client explicitly enables resumable semantics for the session using the ALTER SESSION statement.
Resumable space allocation is suspended when one of the following conditions occur:
Out of space condition
Maximum extents reached condition
Space quota excee ded condition
For nonresumable space allocation, these conditions result in errors and the statement is rolled back.
Suspending a statement automatically results in suspending the transaction. Thus all transactional resources are held through a statement suspend and resume.
When the error condition disappears (for example, as a result of user intervention or perhaps sort space released by other queries), the suspended statement automatically resumes execution.
|
See Also: Oracle Database Administrator's Guide for information about enabling resumable space allocation, what conditions are correctable, and what statements can be made resumable. |
A transaction in Oracle begins when the first executable SQL st atement is encountered. An executable SQL statement is a SQL statement that generates calls to an instance, includin g DML and DDL statements.
When a transaction begins, Oracle assigns the transaction to an available undo tablespace to record the rollback entries for the new transaction.
A transaction ends when any of the follow ing occurs:
A user issues a COMMIT or ROLLBACK statement without a SAVEP
OINT clause.
A user runs a DDL statement such as CREATE, DROP, RE
NAME, or ALTER. If the current transaction contains any DML statements, Oracle first commits the transaction, and
then runs and commits the DDL statement as a new, single statement transaction.
A user disconnects from Oracle. The current transaction is committed.
A user process terminates abnormally. The current transac tion is rolled back.
After one transaction ends, the next executable SQL statement automatically starts the followin g transaction.
< strong>Committing a transaction means making p ermanent the changes performed by the SQL statements within the transaction.
Before a transaction that modifies data is commit ted, the following has occurred:
Oracle has generated undo inform ation. The undo information contains the old data values changed by the SQL statements of the transaction.
Oracle has generated redo log entries in the redo log buffer of the SGA. The redo log recor d contains the change to the data block and the change to the rollback block. These changes may go to disk before a transaction is co mmitted.
The changes have been made to the database buffers of the SGA. These changes may go to disk bef ore a transaction is committed.
|
Note: The data changes for a committed transaction, stored in the database buffers of the SGA, are not necessarily written immediately to the dataf iles by the database writer (DBWn) background process. This writing takes place when it is most efficient for the database t o do so. It can happen before the transaction commits or, alternatively, it can happen some time after the transaction commits. | <
/tr>
When a transaction is committed, the following occurs:
The internal transaction table for the associated undo tablespace that the transaction has committed, and the corres ponding unique system change number (SCN) of the transaction is assigned and recorded in the table.
The log writer p rocess (LGWR) writes redo log entries in the SGA's redo log buffers to the redo log file. It a lso writes the transaction's SCN to the redo log file. This atomic event constitutes the commit of the transaction.
Oracle marks the transaction complete.
|
See Also:
|
Ro lling back means undoing any changes to data that have been performed by SQL statements within an uncommitted transaction. O racle uses undo tablespaces (or rollback segments) to store old values. The redo log contains a record of changes.
Oracle lets you roll back an entire uncommitted transaction. Alternatively, you can roll back the trailing portion of an uncommitted transaction to a marker called a savepoint.
All types of rollbacks use the same procedures:
Statement-level rollback (due to statement or deadlock execution error)
Rollback to a savepoint
Rollback of a transaction due to user request
Rollback of a transaction due to abnormal process ter mination
Rollback of all outstanding transactions when an instance terminates abnormally
Rollback of incomplete transactions during recovery
In rolling back an entire transaction, without referencing any savepoints, the following occurs:
Oracle undoes all changes made by all the SQL statements in the transaction by using the corresponding undo tablespace.
Oracle releases all the trans action's locks of data.
The transaction ends.
|
a>You can declare intermediate markers called s avepoints within the context of a transaction. Savepoints divide a long transaction into smaller parts.
Using savepoi nts, you can arbitrarily mark your work at any point within a long transaction. You then have the option later of rolling back work p erformed before the current point in the transaction but after a declared savepoint within the transaction. For example, you can use savepoints throughout a long complex series of updates, so if you make an error, you do not need to resubmit every statement.
Savepoints are similarly useful in application programs. If a procedure contains several functions, then you can create a savepoint b efore each function begins. Then, if a function fails, it is easy to return the data to its state before the function began and re-ru n the function with revised parameters or perform a recovery action.
After a rollback to a savepoint, Oracle releases the data locks obtained by rolled back statements. Other transactions that were waiting for the previously locked resources can proceed. Othe r transactions that want to update previously locked rows can do so.
When a transaction is rolled back to a savepoint, the following occurs: p>
Oracle rolls back only the statements run after the savepoint.
Oracle preserves t he specified savepoint, but all savepoints that were established after the specified one are lost.
Oracle releases a ll table and row locks acquired since that savepoint but retains all data locks acquired previous to the savepoint.
The transaction remains active and can be continued.
Whenever a session is waiting on a
transaction, a rollback to savepoint does not free row locks. To make sure a transaction does not hang if it cannot obtain a lock, u
se FOR UPDATE ... NOWAIT before issuing UPDATE or DELETE statements.
(This refers to locks obtained before the savepoint to which has been rolled back. Row locks obtained after this savepoint are relea
sed, as the statements executed after the savepoint have been rolled back completely.)
You can name a transaction, using a simple and memorable text string. This name is a reminder of what the transaction is about. Transaction names replace commit comments for distributed transactions, with the following advantages:
It is easier to mo nitor long-running transactions and to resolve in-doubt distributed transactions.
You can view transacti on names along with transaction IDs in applications. For example, a database administrator can view transaction names in Enterprise M anager when monitoring system activity.
Transaction names are written to the transaction auditing redo r ecord, if compatibility is set to Oracle9i or higher.
LogMiner can use transaction names to sea rch for a specific transaction from transaction auditing records in the redo log.
You can use transactio
n names to find a specific transaction in data dictionary views, such as V$TRANSACTION.
Name a transaction using the SET TRANSACTION ... NAME statement before you start
the transaction.
When you name a transaction, you associate the transaction's name with its ID. Transaction names do not have to be unique; different transactions can have the same transaction name at the same time by the same owner. You can use any name that enables you to distinguish the transaction.
In previous releases, you could associate a comment with a transaction by using a commit comment. However, a comment can be associ ated with a transaction only when a transaction is being committed.
Commit comments are still supported for backward compatibi lity. However, Oracle strongly recommends that you use transaction names. Commit comments are ignored in named transactions.
|
Note: In a future release, commit comments will be deprecated. |
|
See Also: < ul>Oracle Database Administrator's Guide for more information about distributed transactions Oracle Database SQL Reference for more information about transaction naming syntax |
In a distributed database, Oracle must coordinate transaction control over a network and maintain data consistency, even if a network or system failure occurs.
A distributed transaction is a transaction that includes one or more statements that update data on two or m ore distinct nodes of a distributed database.
A two-phase commit mechanism guarantees that all database servers participating in a distributed transaction either all commit or all undo the statements in the transaction. A two-phase commit mechanism also protects implicit DML operations p erformed by integrity constraints, remote procedure calls, and triggers.
The Oracle two
-phase commit mechanism is completely transparent to users who issue distributed transactions. In fact, users need not even know the
transaction is distributed. A COMMIT statement denoting the end of a transaction automatically triggers the two-phase co
mmit mechanism to commit the transaction. No coding or complex statement syntax is required to include distributed transactions withi
n the body of a database application.
The recove
rer (RECO) background process automatically resolves the outcome of in-doubt distributed transactions
x2014;distributed transactions in which the commit was interrupted by any type of system or network failure. After the failure is rep
aired and communication is reestablished, the RECO process of each local Oracle database automatically commits or rolls
back any in-doubt distributed transactions consistently on all involved nodes.
In the event of a long-term failure, Oracle all ows each local administrator to manually commit or undo any distributed transactions that are in doubt as a result of the failure. Th is option enables the local database administrator to free any locked resources that are held indefinitely as a result of the long-te rm failure.
If a database must be recovered to a point in the past, Oracle's recovery facilities enable database administrator s at other sites to return their databases to the earlier point in time also. This operation ensures that the global database remains consistent.
Once invoked, an autonomous transaction is totally independent of the main transaction that called it. It does not see any of the uncommitted chang es made by the main transaction and does not share any locks or resources with the main transaction. Changes made by an autonomous tr ansaction become visible to other transactions upon commit of the autonomous transactions.
One autonomous transaction can call another. There are no limits, other than resource limits, on how many levels of autonomous transactions can be called.
Deadlo cks are possible between an autonomous transaction and its calling transaction. Oracle detects such deadlocks and returns an error. T he application developer is responsible for avoiding deadlock situations.
Autonomous transactions are useful for implementing actions that need to be performed independently, regardless of whether the calling transaction commits or rolls back, such as transac tion logging and retry counters.
You can call autonomous tran
sactions from within a PL/SQL block. Use the pragma AUTONOMOUS_TRANSACTION. A pragma is a compiler dire
ctive. You can declare the following kinds of PL/SQL blocks to be autonomous:
Stored procedure or functi on
Local procedure or function
Package
Type me thod
Top-level anonymous block
When an autonomous PL/SQL block is entered, the transact ion context of the caller is suspended. This operation ensures that SQL operations performed in this block (or other blocks called fr om it) have no dependence or effect on the state of the caller's transaction context.
When an autonomous block invokes another autonomous block or itself, the called block does not share any transaction context with the calling block. However, when an autonom ous block invokes a non-autonomous block (that is, one that is not declared to be autonomous), the called block inherits the transact ion context of the calling autonomous block.
Transaction control statements in an autonomous PL/SQL block apply only to the currently active autonomous transaction. Ex amples of such statements are:
SET TRANSACTION COMMIT ROLLBACK SAVEPOINT ROLLBACK TO SAVEPOINT pre>Similarly, transaction control statements in the main transaction apply only to that transaction and not to any autonomous t ransaction that it calls. For example, rolling back the main transaction to a savepoint taken before the beginning of an autonomous t ransaction does not undo the autonomous transaction.