Alvaro Herrera wrote:
> On Thu, Jul 08, 2004 at 10:40:36AM -0700, Josh Berkus wrote:
> 
> > This means that we CANNOT maintain compatibility with other databases without 
> > supporting SAVEPOINT syntax, which we are not yet ready to do.   As a result, 
> > I would propose the following syntax:
> > 
> > Begin main transaction:   BEGIN { TRANSACTION | WORK }
> > Begin inner transaction:  BEGIN { TRANSACTION | WORK }
> > Commit inner transaction:  COMMIT { TRANSACTION | WORK }
> > Commit all transactions:  COMMIT ALL
> > Rollback inner transaction:  ROLLBACK { TRANSACTION }
> > Rollback all transanctions:  ROLLBACK ALL
> 
> We can _not_ do this.  The reason is that COMMIT and ROLLBACK are
> defined per spec to end the transaction.  So they have to end the
> transaction.
> 
> Keep in mind that a nested transaction _is not_ a transaction.  You
> cannot commit it; it doesn't behave atomically w.r.t. other concurrent
> transactions.  It is not a transaction in the SQL meaning of a
> transaction.
> 
> So, when I say "it has to end the transaction" it cannot just end the
> current nested transaction.  It has to end the _real_ transaction.
> 
> 
> My proposal would be:
> 
> 1. Begin main transaction: BEGIN { TRANSACTION | WORK }
> 2. Commit main (all) transaction: COMMIT { TRANSACTION | WORK }
> 3. Rollback main (all) transaction: ROLLBACK { TRANSACTION }
> 
> 4. Begin inner transaction: BEGIN NESTED { TRANSACTION | WORK }
> 5. Commit inner transaction: COMMIT NESTED { TRANSACTION | WORK }
> 6. Rollback inner transaction: ROLLBACK NESTED { TRANSACTION }
> 
> 
> 1, 2 and 3 are not negotiable.  4, 5 and 6 are.

Let me jump in on this.

The initial proposal from Alvaro was to do SUBBEGIN/SUBCOMMIT.  This has
the advantage of allowing BEGIN/COMMIT to commit the entire transaction,
and it is a keyword we can use in plpgsql that doesn't confuse
BEGIN/END.

The disadvantages are:

        o  adds prefix to keyword (SUB) which we don't do other places
        o  doesn't work well with other xact synonyms like BEGIN/END or
           START TRANSACTION/COMMIT TRANSACTION.

Alvaro wants BEGIN/COMMIT to remain spec-compliant and commit the entire
transaction.  One idea was to do BEGIN NESTED/COMMIT NESTED, but does
that allow plpgsql to use it?  If not, it seems pretty useless.  Imagine:

        BEGIN
                NESTED = 3;

or something like that.

As far as savepoints, yes, we should support them.  Josh is saying our
implementation isn't 100% spec compliant.  In what way does it differ?

As far as implementing only savepoints, look at this:

BEGIN;
        BEGIN;
        INSERT INTO ...;
        COMMIT;
        BEGIN;
        INSERT INTO ...;
        COMMIT;
        BEGIN;
        INSERT INTO ...;
        COMMIT;

With savepoints, it looks pretty strange:
        
BEGIN;
        SAVEPOINT x1;
        INSERT INTO ...;
        SAVEPOINT x2;
        INSERT INTO ...;
        SAVEPOINT x3;
        INSERT INTO ...;

or with RELEASE:

BEGIN;
        SAVEPOINT x1;
        INSERT INTO ...;
        RELEASE SAVEPOINT x1;
        SAVEPOINT x1;
        INSERT INTO ...;
        RELEASE SAVEPOINT x1;
        SAVEPOINT x1;
        INSERT INTO ...;
        RELEASE SAVEPOINT x1;

Yea, I guess it works.  With nested transactions, the SQL mimics the
nested structure of many application languages, while savepoints look
like an add-on to SQL.

-- 
  Bruce Momjian                        |  http://candle.pha.pa.us
  [EMAIL PROTECTED]               |  (610) 359-1001
  +  If your life is a hard drive,     |  13 Roberts Road
  +  Christ can be your backup.        |  Newtown Square, Pennsylvania 19073

---------------------------(end of broadcast)---------------------------
TIP 1: subscribe and unsubscribe commands go to [EMAIL PROTECTED]

Reply via email to