Thread: Questions about Rollback - after insert, update, delete ... operations?

Questions about Rollback - after insert, update, delete ... operations?

From
Emi Lu
Date:
greetings,

I remembered I read something in the mailing list about "*rollback*" a
while ago. People mentioned that some operations cannot rollback.
I cannot remember what kinds of perations are not be able to rollback?

For example,

begin
    ... ...
    insert
    ... ...
    delete
    ... ...
    update
    ... ...

    /* If any of the above operation failed, we can rollback all the
above operations? */
    rollback
    ... ...
end


Will all "Insert, delete, update" operations rollback if any of the
operations fails?

Thanks a lot!
Emi

Re: Questions about Rollback - after insert, update,

From
Scott Marlowe
Date:
On Thu, 2005-09-22 at 14:20, Emi Lu wrote:
> greetings,
>
> I remembered I read something in the mailing list about "*rollback*" a
> while ago. People mentioned that some operations cannot rollback.
> I cannot remember what kinds of perations are not be able to rollback?

create database and drop database cannot be rolled back, since
transactions live within a database.  Used to be that truncate couldn't
be, but I think it can now.

I don't think there are any other commands that can't be rolled back.
Certainly simple DML (data manipulation language) stuff can all be
rolled back now.  It's always been an issue for certain DDL (data
definition language) to be roll backable.  (<-- not a word, but the only
way I can think to say it)

>
> For example,
>
> begin
>     ... ...
>     insert
>     ... ...
>     delete
>     ... ...
>     update
>     ... ...
>
>     /* If any of the above operation failed, we can rollback all the
> above operations? */
>     rollback
>     ... ...
> end
>
>
> Will all "Insert, delete, update" operations rollback if any of the
> operations fails?

Yep.  Unless you set a savepoint, any error will result in all of a
transaction being rolled back.  You don't get a choice, without a save
point.   It will be rolled back.

Re: Questions about Rollback - after insert, update,

From
Emi Lu
Date:
We are using (struts) ibates to run the transaction. We already setup
autocommitte = false, and put insert, update, delete into one
transaction. However, we found data were not rollback successfully.
Moreover, in our atomic transaction, some operations are not finished
successfull, but the data are not rollback.

Your inputs are very welcomed!


>On Thu, 2005-09-22 at 14:20, Emi Lu wrote:
>
>
>>greetings,
>>
>>I remembered I read something in the mailing list about "*rollback*" a
>>while ago. People mentioned that some operations cannot rollback.
>>I cannot remember what kinds of perations are not be able to rollback?
>>
>>
>
>create database and drop database cannot be rolled back, since
>transactions live within a database.  Used to be that truncate couldn't
>be, but I think it can now.
>
>I don't think there are any other commands that can't be rolled back.
>Certainly simple DML (data manipulation language) stuff can all be
>rolled back now.  It's always been an issue for certain DDL (data
>definition language) to be roll backable.  (<-- not a word, but the only
>way I can think to say it)
>
>
>
>>For example,
>>
>>begin
>>    ... ...
>>    insert
>>    ... ...
>>    delete
>>    ... ...
>>    update
>>    ... ...
>>
>>    /* If any of the above operation failed, we can rollback all the
>>above operations? */
>>    rollback
>>    ... ...
>>end
>>
>>
>>Will all "Insert, delete, update" operations rollback if any of the
>>operations fails?
>>
>>
>
>Yep.  Unless you set a savepoint, any error will result in all of a
>transaction being rolled back.  You don't get a choice, without a save
>point.   It will be rolled back.
>
>---------------------------(end of broadcast)---------------------------
>TIP 3: Have you checked our extensive FAQ?
>
>               http://www.postgresql.org/docs/faq
>
>


Re: Questions about Rollback - after insert, update,

From
Scott Marlowe
Date:
On Thu, 2005-09-22 at 14:59, Emi Lu wrote:
> We are using (struts) ibates to run the transaction. We already setup
> autocommitte = false, and put insert, update, delete into one
> transaction. However, we found data were not rollback successfully.
> Moreover, in our atomic transaction, some operations are not finished
> successfull, but the data are not rollback.
>
> Your inputs are very welcomed!

I would tend to think it's either a bug in struts or jdbc or you're
making some mistake somewhere.  I'm not familiar with struts and
postgresql together.

You might try logging ALL your SQL statements and seeing what is
actually being sent back and forth between struts / java and postgresql.

Not sure what else to do, as I use libpq to access postgresql, meaning
no layer between my app and pgsql, like with jdbc / struts.

Re: Questions about Rollback - after insert, update,

From
Emi Lu
Date:
If ibatis can catch the exception in the program, rollback will work
fine. Could the failure of the transaction in ibatis because of the
network lost or tomcat server shutting down during the procedure.


For instance, in java program

set autocommit = false;
startTranaction
  insert ...              // step1
  update ...            //step2

  /* Error */
  Network lost to DB server or Tomcat server unexceptly shutting down?

  delete          //step3
commitChanges;

Could it because of the communication interrupt between the Web Server
and DB server during the atomic transaction? As a result, step1 & step2
runs successfully in Database, while step3 failed. Also, rollback failed?



>On Thu, 2005-09-22 at 14:59, Emi Lu wrote:
>
>
>>We are using (struts) ibates to run the transaction. We already setup
>>autocommitte = false, and put insert, update, delete into one
>>transaction. However, we found data were not rollback successfully.
>>Moreover, in our atomic transaction, some operations are not finished
>>successfull, but the data are not rollback.
>>
>>Your inputs are very welcomed!
>>
>>
>
>I would tend to think it's either a bug in struts or jdbc or you're
>making some mistake somewhere.  I'm not familiar with struts and
>postgresql together.
>
>You might try logging ALL your SQL statements and seeing what is
>actually being sent back and forth between struts / java and postgresql.
>
>Not sure what else to do, as I use libpq to access postgresql, meaning
>no layer between my app and pgsql, like with jdbc / struts.
>
>---------------------------(end of broadcast)---------------------------
>TIP 6: explain analyze is your friend
>
>


Re: Questions about Rollback - after insert, update, delete ... operations?

From
Bruno Wolff III
Date:
On Thu, Sep 22, 2005 at 15:20:17 -0400,
  Emi Lu <emilu@cs.concordia.ca> wrote:
> greetings,
>
> I remembered I read something in the mailing list about "*rollback*" a
> while ago. People mentioned that some operations cannot rollback.
> I cannot remember what kinds of perations are not be able to rollback?

I actually have the message saved for reference, so it is easier attach it
rather than try to figure out how to link to it in the archives.
Bruno Wolff III <bruno@wolff.to> writes:
> I wasn't able to find where this is spelled out in the documentation,
> but I believe all DDL commands except DROP DATABASE can be rolled back now.

I don't think there's any all-in-one-place statement about it, but
anything that doesn't explicitly object to being put inside a
transaction block can be rolled back.  Grepping for
PreventTransactionChain, I see that the current suspects are

CLUSTER            (only the multi-table variants)
CREATE DATABASE
DROP DATABASE
REINDEX DATABASE
CREATE TABLESPACE
DROP TABLESPACE
VACUUM

            regards, tom lane

Re: Questions about Rollback - after insert, update,

From
Yonatan Ben-Nes
Date:
Bruno Wolff III wrote:
> On Thu, Sep 22, 2005 at 15:20:17 -0400,
>   Emi Lu <emilu@cs.concordia.ca> wrote:
>
>>greetings,
>>
>>I remembered I read something in the mailing list about "*rollback*" a
>>while ago. People mentioned that some operations cannot rollback.
>>I cannot remember what kinds of perations are not be able to rollback?
>
>
> I actually have the message saved for reference, so it is easier attach it
> rather than try to figure out how to link to it in the archives.
>
>
> ------------------------------------------------------------------------
>
> Subject:
> Re: [GENERAL] Table modifications with dependent views - best
> From:
> Tom Lane <tgl@sss.pgh.pa.us>
> Date:
> Fri, 22 Apr 2005 11:36:43 -0400
> To:
> Bruno Wolff III <bruno@wolff.to>
>
> To:
> Bruno Wolff III <bruno@wolff.to>
> CC:
> David Roussel <pgsql-general@diroussel.xsmail.com>, Michael Fuhr
> <mike@fuhr.org>, John Browne <jkbrowne@gmail.com>,
> pgsql-general@postgresql.org
>
>
> Bruno Wolff III <bruno@wolff.to> writes:
>
>>I wasn't able to find where this is spelled out in the documentation,
>>but I believe all DDL commands except DROP DATABASE can be rolled back now.
>
>
> I don't think there's any all-in-one-place statement about it, but
> anything that doesn't explicitly object to being put inside a
> transaction block can be rolled back.  Grepping for
> PreventTransactionChain, I see that the current suspects are
>
> CLUSTER            (only the multi-table variants)
> CREATE DATABASE
> DROP DATABASE
> REINDEX DATABASE
> CREATE TABLESPACE
> DROP TABLESPACE
> VACUUM
>
>             regards, tom lane
>
>
> ------------------------------------------------------------------------
>
>
> ---------------------------(end of broadcast)---------------------------
> TIP 4: Have you searched our list archives?
>
>                http://archives.postgresql.org

You can add to that list the command TRUNCATE though it can be rollback
its not useful in cases where the truncated data should continue to be
accessed till the transaction be commited.

By the way I posted at the manual a comment about it (at the TRUNCATE
page) but it wasnt autorized, anyone know why? maybe im mistaken? maybe
its a bug and it should work?

Cheers,
   Yonatan Ben-Nes

Re: Questions about Rollback - after insert, update, delete ... operations?

From
Tom Lane
Date:
Bruno Wolff III <bruno@wolff.to> writes:
>> I wasn't able to find where this is spelled out in the documentation,
>> but I believe all DDL commands except DROP DATABASE can be rolled back now.

> I don't think there's any all-in-one-place statement about it, but
> anything that doesn't explicitly object to being put inside a
> transaction block can be rolled back.  Grepping for
> PreventTransactionChain, I see that the current suspects are

> CLUSTER            (only the multi-table variants)
> CREATE DATABASE
> DROP DATABASE
> REINDEX DATABASE
> CREATE TABLESPACE
> DROP TABLESPACE
> VACUUM

As of 8.1, REINDEX SYSTEM needs to be listed as well.

In this context, it may be worth pointing out that CLUSTER, VACUUM, and
REINDEX are all *internally* roll-back-able, as is essential for crash
safety.  The reason they object to being inside a transaction block is
that they want to start and end their own transactions internally so
that they can process each table in a separate transaction.

So, CREATE/DROP DATABASE and CREATE/DROP TABLESPACE really are the only
operations Postgres cannot roll back.

            regards, tom lane

Re: Questions about Rollback - after insert, update,

From
Bruno Wolff III
Date:
On Fri, Sep 23, 2005 at 13:19:34 +0200,
  Yonatan Ben-Nes <da@canaan.co.il> wrote:
>
> You can add to that list the command TRUNCATE though it can be rollback
> its not useful in cases where the truncated data should continue to be
> accessed till the transaction be commited.

I think that is a different issue. This is a problem in that truncate takes
an exclusive lock on the table which might block other things going on
in the database. It could still be useful to rollback a table truncated
in error.