6

我有几个关于 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 回答 2

5

1.a) 不需要锁
1.b) 锁定表(myisam 引擎),或者如果您使用 innodb 引擎,则您有行级锁定

2.a) 为读操作锁定表(直到这个锁被释放,没有写操作发生)
2.b) 不需要锁

正如 Lithu TV 建议的那样,请阅读文档获取所有用例。

于 2013-04-16T10:05:36.923 回答
0
  1. 据我所知,在 mysql 中,表不会自动锁定。但这取决于你使用什么。例如,使用 SqlTransaction,受影响的表将被锁定,直到您提交或回滚。

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

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

$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

于 2013-04-16T10:07:39.800 回答