Hi, I've been experimenting with locking tables in oracle 8 using queries
like "lock table x in exclusive mode nowait". In my stand-alone script,
using PEAR::DB objects, I am trying to lock a table for the duration of a
transaction, and using a second connection, attempt to take out the same
lock.
I would expect that a 2nd db connection would not be able to take out the
lock after the 1st one has acquired it, but it seems to work. If I run the
same script twice (simultaneously), the 2nd script fails when it tries to
get the lock, as expected.
ie. I thought the following would output:
got first lock
can't get second lock
but instead i get:
got first lock
got second lock
and if run a second time while the first instance is sleeping:
can't get first lock
Why does this behaviour occur?
Tristan.
<?
require_once ('DB.php');
$conn1 = DB::connect("oci8://***");
$conn2 = DB::connect("oci8://***");
$conn1->autoCommit(false);
$conn2->autoCommit(false);
// Lock the table in session 1
if (DB::isError($conn1->query("lock table x in exclusive mode nowait")))
{
echo "can't get first lock\n";
echo $conn1->error;
}
else
{
echo "got first lock\n";
// Attempt to take out lock in another session - this succeeds as well
if (DB::isError($conn2->query("lock table x in exclusive mode nowait")))
{
echo "can't get second lock\n";
echo $conn2->error;
}
else
echo "got second lock\n";
}
// wait a bit so we can run the script again
sleep(10);
?>
--
PHP Database Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php