Tables in the
cannot be locked with
TABLES, except the
The following statements are prohibited while a
LOCK TABLES statement is in
CREATE TABLE ...
DROP VIEW, and DDL statements on
stored functions and procedures and events.
For some operations, system tables in the
mysql database must be accessed. For example,
HELP statement requires the
contents of the server-side help tables, and
CONVERT_TZ() might need to read
the time zone tables. The server implicitly locks the system
tables for reading as necessary so that you need not lock them
explicitly. These tables are treated as just described:
mysql.help_category mysql.help_keyword mysql.help_relation mysql.help_topic mysql.proc mysql.time_zone mysql.time_zone_leap_second mysql.time_zone_name mysql.time_zone_transition mysql.time_zone_transition_type
If you want to explicitly place a
on any of those tables with a
TABLES statement, the table must be the only one
locked; no other table can be locked with the same statement.
Normally, you do not need to lock tables, because all single
UPDATE statements are atomic; no
other session can interfere with any other currently executing
SQL statement. However, there are a few cases when locking
tables may provide an advantage:
If you are going to run many operations on a set of
MyISAMtables, it is much faster to lock the tables you are going to use. Locking
MyISAMtables speeds up inserting, updating, or deleting on them because MySQL does not flush the key cache for the locked tables until
UNLOCK TABLESis called. Normally, the key cache is flushed after each SQL statement.
The downside to locking the tables is that no session can update a
READ-locked table (including the one holding the lock) and no session can access a
WRITE-locked table other than the one holding the lock.
If you are using tables for a nontransactional storage engine, you must use
LOCK TABLESif you want to ensure that no other session modifies the tables between a
UPDATE. The example shown here requires
LOCK TABLESto execute safely:
LOCK TABLES trans READ, customer WRITE; SELECT SUM(value) FROM trans WHERE customer_id=some_id; UPDATE customer SET total_value=sum_from_previous_statement WHERE customer_id=some_id; UNLOCK TABLES;
You can also avoid locking tables in some cases by using the
user-level advisory lock functions
RELEASE_LOCK(). These locks are
saved in a hash table in the server and implemented with
pthread_mutex_unlock() for high speed. See
Section 12.20, “Miscellaneous Functions”.
See Section 8.11.1, “Internal Locking Methods”, for more information on locking policy.