Rusty Keele wrote:
Hi,

  I am trying to find out if using mysqli::autocommit() automatically locks the 
DB tables that are being used by a query.
Here's my problem: I am looking over some PHP code that is causing intermittent dead lock conditions in a MySQL DB (using InnoDB engine.) Basically the code creates an array of SQL queries (inserts and updates), turns autocommit off, runs all the queries, then commits them:

            $conn->autocommit(false);
            $this->PersistCache();
            $conn->commit();

      The PersistCache() method just loops through the array and executes each 
query.  I have looked through the code and don't see an explicit LOCK statement 
anywhere, so I'm thinking that maybe autocommit() is somehow locking the tables 
that are being updated.  I have checked out the PHP documentation and it says 
nothing about locking.  Any ideas?

Thanks,
-Rusty
Rusty,
A deadlock is usually caused by 2 queries in conflict, not table locks. If you did explicitly lock the tables, you'd probably eliminate the deadlocks. See http://www.xaprb.com/blog/2006/08/08/how-to-deliberately-cause-a-deadlock-in-mysql/ for a simple example on how a deadlock can happen through normal use. See http://dev.mysql.com/doc/refman/5.0/en/innodb-deadlocks.html for how to cope with deadlocks, or http://dev.mysql.com/doc/refman/5.0/en/innodb-transaction-model.html for more on InnoDB in general.

We had the same issue a month or so ago, and I took this advice from the mySQL page: "Always be prepared to re-issue a transaction if it fails due to deadlock. Deadlocks are not dangerous. Just try again." Basically, whenever we get a deadlock, we just re-issue the query up to 10 times before throwing a failure notice.

Ben

_______________________________________________

UPHPU mailing list
[email protected]
http://uphpu.org/mailman/listinfo/uphpu
IRC: #uphpu on irc.freenode.net

Reply via email to