I try and load tables via MySQL and get the following error?
MySQL said: Table \'cms\' was not locked with LOCK TABLES
Why does
If in one session, you locked one table but want to select from another table, you must either lock that table too or unlock all tables.
mysql> LOCK TABLES t1 READ;
mysql> SELECT COUNT(*) FROM t1;
+----------+
| COUNT(*) |
+----------+
| 3 |
+----------+
mysql> SELECT COUNT(*) FROM t2;
ERROR 1100 (HY000): Table 't2' was not locked with LOCK TABLES
I encountered this problem:
LOCK TABLE <table_a> READ;
LOCK TABLE <table_b> READ;
LOCK TABLE <table_a> WRITE;
LOCK TABLE <table_b> WRITE;
then I read from , this raises Table 'table_a' was not locked with Lock Tables
.
After reading documentation, I fix the lock code to :
LOCK TABLE <table_a> WRITE, <table_b> WRITE
This solve the problem for me.
lock type
READ Read lock, no writes allowed
WRITE Exclusive write lock. No other connections can read or write to this table
One of the most important lines in the MySQL docs relating to the "Table 'my_table' was not locked with LOCK TABLES" message is as follows:
"While the locks thus obtained are held, the session can access only the locked tables" https://dev.mysql.com/doc/refman/8.0/en/lock-tables.html
This means that if you are trying to access any other table in the database while the LOCK is in place you will get the error message "Table 'my_table' was not locked with LOCK TABLES"
The fix is to apply the lock to all of the tables you want to have access to during the lock like this. "LOCK TABLES table_1 WRITE, table_2 WRITE"
Where table_1 is the one you really want to lock but you also want to access table_2 during the same process.
This was confusing because I was locking only table_1 but the error message was telling me Table 'table_2' was not locked with LOCK TABLES
Took me a while to figure out why table_2 was even involved. I hope that this helps someone else with the same issue.
The solution for me was to unlock the tables. They had been locked by a previous queries which failed before reaching the unlock tables
statement.
UNLOCK TABLES
SELECT ...
In my case, this error occurred because I was attempting to import data from Windows to Linux: Windows is case-insensitive and had all lowercase table names, but Linux is case-sensitive and had the same table names, but with uppercase letters. Once I changed the case of the source table names to match the destination table names, this error no longer occurred. The following SO post explains the case sensitivity issue between Windows and Linux in regards to mysql: Are table names in MySQL case sensitive?
In my case the problem was the aliases.
From the docs:
If your statements refer to a table by means of an alias, you must lock the table using that same alias. It does not work to lock the table without specifying the alias.
Conversely, if you lock a table using an alias, you must refer to it in your statements using that alias.
Wrong:
LOCK TABLE my_table READ;
SELECT * FROM my_table t;
#ERROR 1100: Table 't' was not locked with LOCK TABLES
Correct:
LOCK TABLE my_table t READ;
SELECT * FROM my_table t;