Postgres-Transaction-user_ignore_abort-Connection stop by the client

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi,

I use Postgresql 7.2.2 + php 4.2.3 and I meet a problem with
transaction and connections interruption.

The application is the famous example of the bank accounts and the money
transfers. I consider a table named "DEAL" where each transaction is
saved. Each tuple has an id number as key. When a tuple is added,
the maximum value of id is computed, and increased by one to
determinate the key of the next tuple.

My script php follows this steps :

        ignore_user_abort(0|1)
        Compute the key -> v
        BEGIN WORK
        UPDATE the first bank account with v (credit)
        sleep(300)
        UPDATE the second bank account with v+1 (debit)
        COMMIT WORK

While the sleep, the client may use the STOP button on his browser and
stop the connection.

I tried to execute exhaustive tests : ignore_user_abort(0) or
ignore_user_abort(1), with or without transaction, with or
without rollback.

For these tests,  I follow two steps :

1/ the client execute the first request but stops the connection
while the sleep instruction.
2/ with pgaccess, I read the content of DEAL
3/ the client executes a new request without interruption
4/ the result is displayed on the browser and checked with pgaccess

--------------------
TEST 1
--------------------

request 1
*********

ignore_user_abort(0)
Compute the key -> v=10
BEGIN WORK
UPDATE the first bank account with v as key (credit)
sleep(300)                            ------> INTERRUPT !!!!
UPDATE the second bank account with v+1 as key (debit)
COMMIT WORK

Result : nothing new in the database (with pgaccess)

request 2
*********

ignore_user_abort(0)
Compute the key -> v=10
BEGIN WORK
UPDATE the first bank account with v (credit)
UPDATE the second bank account with v+1 (debit)
COMMIT WORK

Result : the request 1 is executed now ! and while the key
(v=10) is the same, the request 2 fails.

Problem : why the whole first request is taking into account
now ?


--------------------
TEST 2
--------------------

The same by removing BEGIN and COMMIT.

The first request : only the first update (before the stop)
is executed

The second request is executed correctly.

Problem : ignore_user_abort is called with 0, so why the execution
of the script for the first request doesn't continue ?

--------------------
TEST 3 and 4
--------------------

The tests 3 and 4 reproduce the test 1 and 2 by using
ignore_user_abort(1).
The results are absolutely the same !

--------------------
TEST 5 and 6
--------------------

The tests 5 and 6 reproduce the test 1 and 2 by using ROLLBACK
if ( connection_aborted() ) { ROLLBACK WORK; exit } is added
after the sleep.
The results are absolutely the same again !


I find the results very strange, isn't it.

In advance, thanks for your help.


mb

-- 
PHP Database Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php


[Index of Archives]     [PHP Home]     [PHP Users]     [Postgresql Discussion]     [Kernel Newbies]     [Postgresql]     [Yosemite News]

  Powered by Linux