mysql是否在选择,更新或删除时锁定表?

时间:2013-04-16 09:46:39

标签: mysql locking

我对MySQL表lock有几个问题。如果有人回答我很感激:)

  1. 在以下情况下,MySQL会自动锁定表格:

    • SELECT id FROM members;
    • UPDATE members SET name = 'john' WHERE id = 7;
  2. 这两者有什么区别:

    • LOCK TABLE items READ ; SELECT * FROM 'items;
    • SELECT * FROM 'items';
  3. 出于某种原因,我认为MySQL会在必要的场合自动锁定表格!如何检查锁定何时以及如何发生?

  4. 谢谢。

2 个答案:

答案 0 :(得分:2)

1.a)无需锁定
1.b)锁定表(myisam引擎)或者如果你使用innodb引擎你有行级锁定

2.a)锁定表以进行读取操作(直到释放此锁定,不发生写入操作)
2.b)无需锁定

正如Lithu T.V建议的那样,请阅读DOCS以获取所有用例。

答案 1 :(得分:0)

  1. 据我所知,在mysql中,表格不会自动锁定。但这取决于你使用什么。 例如,使用SqlTransaction时,受影响的表将被锁定,直到您提交或回滚为止。

  2. 一个。你首先锁定表,这将确保在你读表时,没有其他人可以锁定它来写,你会遇到死锁;) 湾在某些特殊情况下,锁定表可能会阻止您读取表,因此sql失败。

  3. 使用“SHOW OPEN TABLES”,您将看到所有可用的表及其锁定状态 由于要排除的系统表,它有点复杂,如:

  4. $sql = "SHOW OPEN TABLES FROM '".$db_name."'
    WHERE In_use > 0
    AND
    'Table' IN (";
    
    $tables = count($array_tables_names);
    for($i = 0; $i < $tables; $i++):
    $sql .= "'".$array_tables_names[$i]."'";
    if($i < ($tables-1)) $sql .= ",";
    endfor;
    
    $sql .= ")";
    

    有关锁的更多信息,请访问: http://dev.mysql.com/doc/refman/5.1/en//lock-tables.html