Hi,

I'm trying to understand LOCKing mechanism, but it is not enough described in the 
manual, so I have to test it myself.

To see what happens when I use tables I haven't locked, I created a PHP script like 
this:

$sql = "USE fakturace";                              if(!$res = 
mysql_query($sql,$spoj)){  decho(' A '.$sError = sql_error(mysql_error(),$sql)); }
$sql = "LOCK TABLES $gt_firmy WRITE";   if(!$res = mysql_query($sql,$spoj)){  decho(' 
A '.$sError = sql_error(mysql_error(),$sql)); }
$sql = "SELECT * FROM $gt_firmy AS f";    if(!$res = mysql_query($sql,$spoj)){  
decho(' B '.$sError = sql_error(mysql_error(),$sql)); }
$sql = "INSERT INTO test SET id = NULL";  if(!$res = mysql_query($sql,$spoj)){  
decho(' C '.$sError = sql_error(mysql_error(),$sql)); }
$sql = 'UNLOCK TABLES';                          if(!$res = mysql_query($sql,$spoj)){  
decho(' Z '.$sError = sql_error(mysql_error(),$sql)); }

The result is expected:

 B MySQL error: Table 'f' was not locked with LOCK TABLES
SQL: SELECT * FROM firmy AS f

C MySQL error: Table 'test' was not locked with LOCK TABLES
SQL: INSERT INTO test SET id = NULL

The output doesn't change, until PhpMyAdmin sends

    SHOW TABLE STATUS FROM fakturace

This query hangs on the server and no other query to database fakturace can be done. 
Is that ok?

That's not all. When I did SHOW PROCESSLIST, I got this:

+----+-----------+-----------+-----------+---------+------+--------+------------------------------------+
| Id | User      | Host      | db        | Command | Time | State  | Info              
          |
+----+-----------+-----------+-----------+---------+------+--------+------------------------------------+
|  1 | fakturace | localhost | fakturace | Sleep   | 716  |        | NULL              
          |
|  2 | fakturace | localhost | fakturace | Sleep   | 606  |        | NULL              
          |
|  5 | fakturace | localhost | fakturace | Sleep   | 549  |        | NULL              
          |
|  7 | fakturace | localhost | fakturace | Sleep   | 472  |        | NULL              
          |
|  9 | root      | localhost | zona3d    | Query   | 410  | Locked | SHOW TABLE STATUS 
FROM `fakturace` |
| 10 | root      | localhost | NULL      | Query   | 47   | Locked | SHOW TABLE STATUS 
FROM fakturace   |
| 11 | fakturace | localhost | fakturace | Query   | 30   | Locked | SELECT * FROM 
firmy AS f           |
| 12 | root      | localhost | NULL      | Query   | 0    | NULL   | show processlist  
                 |
+----+-----------+-----------+-----------+---------+------+--------+------------------------------------+
8 rows in set (0.00 sec)

So I killed that threads what locked the table:    kill 1; kill 2; kill 5; kill 7;

+----+-----------+-----------+-----------+---------+------+--------+------------------------------------+
| Id | User      | Host      | db        | Command | Time | State  | Info              
          |
+----+-----------+-----------+-----------+---------+------+--------+------------------------------------+
|  1 | fakturace | localhost | fakturace | Killed  | 1036 |        | NULL              
          |
|  2 | fakturace | localhost | fakturace | Killed  | 926  |        | NULL              
          |
|  5 | fakturace | localhost | fakturace | Killed  | 869  |        | NULL              
          |
|  7 | fakturace | localhost | fakturace | Killed  | 792  |        | NULL              
          |
|  9 | root      | localhost | zona3d    | Query   | 730  | Locked | SHOW TABLE STATUS 
FROM `fakturace` |
| 10 | root      | localhost | NULL      | Query   | 367  | Locked | SHOW TABLE STATUS 
FROM fakturace   |
| 11 | fakturace | localhost | fakturace | Query   | 350  | Locked | SELECT * FROM 
firmy AS f           |
| 12 | root      | localhost | NULL      | Query   | 0    | NULL   | show processlist  
                 |
+----+-----------+-----------+-----------+---------+------+--------+------------------------------------+

But the queries SHOW TABLE STATUS are still hanging and after a while whole computers 
gets stunned, nothingchanges in processlist and the processor runs at 100% (P4 1.5 
GHz). While writing this mail, thread id # 11 changed to Reopen tables, then Waiting 
for tables, then NULL.

I don't understand it at alll as I am not familiar fwith locking, but i think this 
behavior is bad. Should I report this as a bug? I am using 3.23.58 and I DON'T want to 
install newer, because 3.x is running on servers I use for hosting.

Thanks, Ondra

Reply via email to