Re: [QUESTIONS] errors on transactions and locks ? - Mailing list pgsql-hackers

From Bruce Momjian
Subject Re: [QUESTIONS] errors on transactions and locks ?
Date
Msg-id 199909170445.AAA07310@candle.pha.pa.us
Whole thread Raw
In response to Re: [QUESTIONS] errors on transactions and locks ?  ("Jose' Soares Da Silva" <sferac@proxy.bazzanese.com>)
List pgsql-hackers
I think 6.6 will improve this.


> On Tue, 21 Apr 1998, Herouth Maoz wrote:
> 
> Your example is very exhaustive Herouth. I tried it with SOLID and in fact
> it leaves SOLID database inconsistent.
> 
> I see that PostgreSQL BEGIN/END statements are slight different from SQL
> transactions that begins with a implicit begin transaction (no BEGIN command)
> and ends with a ROLLBACK or COMMIT statement.
> 
> Until now I thought that END was equal to COMMIT but in the case of:
>        NOTICE:  (transaction aborted): queries ignored until END
>        *ABORT STATE*
> in this case END stands for ROLLBACK/ABORT I think it isn't enough clear.
> (I thought all reference to END were changed to COMMIT).
> PostgreSQL don't say to the user that all his work will be lost even if he do
> COMMIT.
> 
> Maybe the following warn is more clear:
>        NOTICE:  (transaction aborted): queries ignored until COMMIT/ROLLBAK
>        WARN:  all changes will be lost even if you use COMMIT.
> 
> Of course SQL transaction allows all kind of SQL command because it doesn't 
> works outside transactions.
> 
> PostgreSQL is more restrictive than SQL, then I think we need to know
> what kind of statements we can use successful inside transactions and
> PostgreSQL should reject all invalid commands.
> 
> (I have to change information on BEGIN reference manual page, we have to
> document this feature of PostgreSQL).
> 
> I've tried the following commands:
>       o CREATE TABLE works.
>       o DROP TABLE doesn't work properly after ROLLBACK, the table lives
>         but it's empty.
>       o CREATE/DROP INDEX works.
>       o CREATE/DROP SEQUENCE works.
>       o CREATE/DROP USER works.
>       o GRANT/REVOKE works.
>       o DROP VIEW works.
>       o CREATE VIEWS aborts transactions see below:
>       o DROP AGGREGATE works.
>       o CREATE AGGREGATE doesn't work.
>       o DROP FUNCTION works.
>       o CREATE FUNCTION doesn't work.
>       o ALTER TABLE seems that doesn't work properly see below:
>       o CREATE/DROP DATABASE removes references from "pg_database" but
>         don't remove directory /usr/local/pgsql/data/base/name_database.
> ...Maybe somebody knows what more is valid/invalid inside transactions...
> 
> o EXAMPLE ALTER TABLE:
> 
> postgres=> begin;
> BEGIN
> postgres=> \d a
> 
> Table    = a
> +----------------------------------+----------------------------------+-------+
> |              Field               |              Type                | Length|
> +----------------------------------+----------------------------------+-------+
> | a                                | int2                             |     2 |
> +----------------------------------+----------------------------------+-------+
> postgres=> select * from a;
>     a
> -----
> 32767
> (1 rows)
> postgres=> alter table a add b int;
> ADD
> postgres=> \d a
> 
> Table    = a
> +----------------------------------+----------------------------------+-------+
> |              Field               |              Type                | Length|
> +----------------------------------+----------------------------------+-------+
> | a                                | int2                             |     2 |
> | b                                | int4                             |     4 |
> +----------------------------------+----------------------------------+-------+
> postgres=> select * from a;
>     a|b
> -----+-
> 32767|
> (1 rows)
> 
> postgres=> rollback;
> ABORT
> postgres=> \d a
> 
> Table    = a
> +----------------------------------+----------------------------------+-------+
> |              Field               |              Type                | Length|
> +----------------------------------+----------------------------------+-------+
> | a                                | int2                             |     2 |
> +----------------------------------+----------------------------------+-------+
> postgres=> select * from a;
>     a|b     <------------------ column b is already here. Why ?
> -----+-
> 32767|
> (1 rows)
> postgres=> rollback;
> ABORT
> postgres=> \d a
> 
> Table    = a
> +----------------------------------+----------------------------------+-------+
> |              Field               |              Type                | Length|
> +----------------------------------+----------------------------------+-------+
> | a                                | int2                             |     2 |
> +----------------------------------+----------------------------------+-------+
> postgres=> select * from a;
>     a|b
> -----+-
> 32767|
> (1 rows)
> 
> 
> o EXAMPLE CREATE VIEW:
> 
> postgres=> begin;
> BEGIN
> postgres=> create view error as select * from films;
> CREATE
> postgres=> \d  error
> 
> Table    = error
> +----------------------------------+----------------------------------+-------+
> |              Field               |              Type                | Length|
> +----------------------------------+----------------------------------+-------+
> | code                             | char()                           |     5 |
> | title                            | varchar()                        |    40 |
> | did                              | int4                             |     4 |
> | date_prod                        | date                             |     4 |
> | kind                             | char()                           |    10 |
> | len                              | int2                             |     2 |
> +----------------------------------+----------------------------------+-------+
> postgres=> select * from error;
> PQexec() -- Request was sent to backend, but backend closed the channel before responding.
>         This probably means the backend terminated abnormally before or while processing the request.
> 
> > At 16:15 +0100 on 21/4/98, Jose' Soares Da Silva wrote:
> > 
> > 
> > > * Bad, this isn't very friendly.
> > >
> > > * No. What I would is that PostgreSQL don't abort at every smallest
> > >   syntax error.
> > 
> > It depends on what you expect from a transaction. The way I see it, a
> > transaction is a sequence of operations which either *all* succeed, or
> > *all* fail. That is, if one of the operations failed, even for a syntax
> > error, Postgres should not allow any of the other operations in the same
> > transaction to work.
> > 
> > For example, suppose you want to move money from one bank account to
> > another, you'll do something like:
> > 
> > BEGIN;
> > 
> > UPDATE accounts
> > SET credit = credit - 20,000
> > WHERE account_num = '00-xx-00';
> > 
> > UPDATE accounts
> > SET credit = credit + 20000
> > WHERE account_num = '11-xx-11';
> > 
> > END;
> > 
> > Now, look at this example. There is a syntax error in the first update
> > statement - 20,000 should be without a comma. If Postgres were tolerant,
> > your client would have an extra 20,000 dollars in one of his account, and
> > the money came from nowhere, which means your bank loses it, and you lose
> > your job...
> > 
> > But a real RDBMS, as soon as one of the statement fails - no matter why -
> > the transaction would not happen. It notifies you that it didn't happen.
> > You can then decide what to do - issue a different transaction, fix the
> > program, whatever.
> > 
> > The idea is that the two actions (taking money from one account and putting
> > it in another) are considered atomic, inseparable, and dependent. If your
> > "real world" thinking says that the next operation should happen, no matter
> > if the first one succeeded or failed, then they shouldn't be inside the
> > same transaction.
> > 
> > Herouth
> 
> --
> Official WWW Site: http://www.postgresql.org
> Online Docs & FAQ: http://www.postgresql.org/docs
> Searchable Lists: http://www.postgresql.org/mhonarc
> 
> 


--  Bruce Momjian                        |  http://www.op.net/~candle maillist@candle.pha.pa.us            |  (610)
853-3000+  If your life is a hard drive,     |  830 Blythe Avenue +  Christ can be your backup.        |  Drexel Hill,
Pennsylvania19026
 


pgsql-hackers by date:

Previous
From: Bruce Momjian
Date:
Subject: Re: [HACKERS] pgaccess seems a tad confused
Next
From: Thomas Lockhart
Date:
Subject: Re: [HACKERS] Join syntax