Informix Guide to SQL: Tutorial
Chapter 4: Modifying Data
Home
Contents
Index
Master Index
New Book
Interrupted Modifications
Even if all the software is error-free, and all the hardware is utterly reliable, the world outside the computer can interfere. Lightning might strike the building, interrupting the electrical supply and stopping the computer in the middle of your
UPDATE
statement. A more likely scenario occurs when a disk fills up, or a user supplies incorrect data, causing your multirow insert to stop early with an error. In any case, as you are modifying data, you must assume that some unforeseen event can interrupt the modification.
When a modification is interrupted by an external cause, you cannot be sure how much of the operation was completed. Even in a single-row operation, you cannot know whether the data reached the disk or the indexes were properly updated.
If multirow modifications are a problem, multistatement modifications are worse. They are usually embedded in programs so you do not see the individual SQL statements being executed. For example, the job of entering a new order in the
stores7
database requires you to perform the following steps:
Insert a row in the
orders
table. (This insert generates an order number.)
For each item ordered, insert a row in the
items
table.
Two ways to program an order-entry application exist. One way is to make it completely interactive so that the program inserts the first row immediately, and then inserts each item as the user enters data. But this approach exposes the operation to the possibility of many more unforeseen events: the customer's telephone disconnecting, the user pressing the wrong key, the user's terminal or computer losing power, and so on.
The right way to build an order-entry application is described in the following list:
Accept all the data interactively.
Validate the data and expand it (by looking up codes in
stock
and
manufact
, for example).
Display the information on the screen for inspection.
Wait for the operator to make a final commitment.
Perform the insertions quickly.
Even with these steps, an unforeseen circumstance can halt the program after it inserts the order but before it finishes inserting the items. If that happens, the database is in an unpredictable condition: its
data integrity
is compromised.
The Transaction
The solution to all these potential problems is called the
transaction
. A transaction is a sequence of modifications that must be accomplished either completely or not at all. The database server guarantees that operations performed within the bounds of a transaction are either completely and perfectly committed to disk, or the database is restored to the same state as before the transaction started.
The transaction is not merely protection against unforeseen failures; it also offers a program a way to escape when the program detects a logical error.
Transaction Logging
The database server can keep a record of each change that it makes to the database during a transaction. If something happens to cancel the transaction, the database server automatically uses the records to reverse the changes. Many things can make a transaction fail. For example, the program that issues the SQL statements can crash or be terminated. As soon as the database server discovers that the transaction failed, which might be only after the computer and the database server are restarted, it uses the records from the transaction to return the database to the same state as before.
The process of keeping records of transactions is called
transaction logging
or simply
logging
. The records of the transactions, called
log records
, are stored in a portion of disk space separate from the database. In Universal Server, this space is called the
logical log
(because the log records represent logical units of the transactions).
Databases do not generate transaction records automatically. The database administrator decides whether to make a database use transaction logging. Without transaction logging, you cannot roll back transactions.
Logging and Cascading Deletes
Logging must be turned on in your database for cascading deletes to work because, when you specify a cascading delete, the delete is first performed on the primary key of the parent table. If the system crashes after the rows of the primary key of the parent table are performed but before the rows of the foreign key of the child table are deleted, referential integrity is violated. If logging is turned off, even temporarily, deletes do not cascade. After logging is turned back on, however, deletes can cascade again. Turn logging on with the
CREATE DATABASE
statement for Universal Server.
Specifying Transactions
You can use two methods to specify the boundaries of transactions with SQL statements. In the most common method, you specify the start of a multistatement transaction by executing the
BEGIN WORK
statement. In databases that are created with the
MODE ANSI
option, no need exists to mark the beginning of a transaction. One is always in effect; you indicate only the end of each transaction.
In both methods, to specify the end of a successful transaction, execute the
COMMIT WORK
statement. This statement tells the database server that you reached the end of a series of statements that must succeed together. The database server does whatever is necessary to make sure that all modifications are properly completed and committed to disk.
A program can also cancel a transaction deliberately by executing the
ROLLBACK WORK
statement. This statement asks the database server to cancel the current transaction and undo any changes.
An order-entry application can use a transaction in the following ways when it creates a new order:
Accept all data interactively
Validate and expand it
Wait for the operator to make a final commitment
Execute
BEGIN WORK
Insert rows in the
orders
and
items
tables, checking the error code that the database server returns
If no errors occurred, execute
COMMIT WORK
; otherwise execute
ROLLBACK WORK
If any external failure prevents the transaction from being completed, the partial transaction rolls back when the system restarts. In all cases, the database is in a predictable state. Either the new order is completely entered, or it is not entered at all.
Informix Guide to SQL: Tutorial
, version 9.1
Copyright © 1998, Informix Software, Inc. All rights reserved.