Transaction blocks are explicitly started with the BEGIN SQL command. This keyword may
optionally be followed by either of the noise terms WORK or
TRANSACTION, though they have no effect on the statement, or the transaction block.
Example 7-38 begins a transaction block within the
booktown database.
Example 7-38. Beginning a transaction
booktown=#
BEGIN;
BEGIN
Any SQL statement made after the BEGIN SQL command will appear to take effect as
normal to the user making the modifications. As stated earlier, however, other users connected to the database will be
oblivious to the modifications that appear to have been made from within your transaction block until it is committed.
Transaction blocks are closed with the COMMIT SQL command, which may be
followed by either of the optional noise terms WORK or
TRANSACTION. Example 7-39 uses the
COMMIT SQL command to synchronize the database system with the result of an
UPDATE statement.
Example 7-39. Committing a transaction
booktown=#
BEGIN;
BEGIN
booktown=#
UPDATE subjects SET location = NULL
booktown-#
WHERE id = 12;
UPDATE 1
booktown=#
SELECT location FROM subjects WHERE id = 12;
location
----------
(1 row)
booktown=#
COMMIT;
COMMIT
Again, even though the SELECT statement immediately reflects the result of the
UPDATE statement in Example 7-39, other users connected to the
same database will not be aware of that modification until after the COMMIT statement is
executed.
To roll back a transaction, the ROLLBACK SQL command is used. Again, either
of the optional noise terms WORK or TRANSACTION may follow
the ROLLBACK command.
Example 7-40 begins a transaction block, makes a modification to the
subjects table, and verifies the modification within the block. The transaction is then rolled back,
returning the subjects table to the state that it was in before the transaction block began.
Example 7-40. Rolling back a transaction
booktown=#
BEGIN;
BEGIN
booktown=#
SELECT * FROM subjects WHERE id = 12;
id | subject | location
----+----------+----------
12 | Religion |
(1 row)
booktown=#
UPDATE subjects SET location = 'Sunset Dr'
booktown-#
WHERE id = 12;
UPDATE 1
booktown=#
SELECT * FROM subjects WHERE id = 12;
id | subject | location
----+----------+-----------
12 | Religion | Sunset Dr
(1 row)
booktown=#
ROLLBACK;
ROLLBACK
booktown=#
SELECT * FROM subjects WHERE id = 12;
id | subject | location
----+----------+----------
12 | Religion |
(1 row)
PostgreSQL is very strict about errors in SQL statements inside of transaction blocks.
Even an innocuous parse error, such as that
shown in Example 7-41, will cause the transaction to enter into the
ABORT STATE. This means that no further statements may be executed until either the
COMMIT or ROLLBACK command is used to end the transaction
block.
Example 7-41. Recovering from the abort state
booktown=#
BEGIN;
BEGIN
booktown=#
SELECT * FROM;
ERROR: parser: parse error at or near ";"
booktown=#
SELECT * FROM books;
NOTICE: current transaction is aborted, queries ignored until end of transaction block
*ABORT STATE*
booktown=#
COMMIT;