Hello everybody,

Some days ago I've posted a question about interbase locking. I've solved
the problem after searching at interbase developers network and php manuals.
Let me drop some line about my experiences...

Deadlock is when two (or more) transactions want update or delete a field
in the same table at the same time.
For cause a deadlock in Interbase do the following:

   $tr_id1 = ibase_trans();
   $tr_id2 = ibase_trans();

   $result = ibase_query($tr_id1, "UPDATE TEST SET FIELD_A=FIELD_C");
   echo "First result: $result<br>";
   ibase_commit($tr_id1);

   $result = ibase_query($tr_id2, "UPDATE TEST SET FIELD_A=FIELD_C");
   echo "Second result: $result<br>";

If you run this you can see that the second result will be false and you'll
get
an error about interbase deadlock. Thats all right about interbase his do
its best when doing this. This error must be handled by the application.

So simple complete the code above with some check and rollback, like this:

   $tr_id1 = ibase_trans();
   $tr_id2 = ibase_trans();

   $result = ibase_query($tr_id1, "UPDATE TEST SET FIELD_A=FIELD_C");
   echo "First result: $result<br>";
   ibase_commit($tr_id1);

   $result = 0;

   while (!$result) {
     $result = @ibase_query($tr_id2, "UPDATE TEST SET FIELD_A=FIELD_C");
     echo "Second result: $result<br>";
     if (!$result) {
       ibase_rollback($tr_id2);
       $tr_id2 = ibase_trans();
     }
   }


   ibase_commit($tr_id2);

This will works nicely, and you will see that the first query will fail but
the second
query (in another one transaction!) will be correct. The complete solution
is when you
write a function for the queries to runs in a transaction and its check.

Regards,


Tibor


--
Integranet Internet Service Provider Co. - www.integranet.hu
GnuPG fingerprint: 189C B343 71A8 C25F 7456  F46F D522 C34C ED7F A574
Koleszár Tibor, Director and Senior System Engineer, Debian Developer
[EMAIL PROTECTED], [EMAIL PROTECTED], http://www.oldw.net



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

Reply via email to