2013-04-16 71 views
2

我有幾個關於MySQL表lock的問題。我很感激,如果有人回答:)MySQL是否在選擇,更新或刪除時鎖定表?

  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的自動鎖定在必要的場合桌子底下!我如何檢查鎖定發生的時間和方式?

謝謝。

+2

取決於...什麼存儲引擎?在交易中?如果是這樣,什麼隔離級別? – eggyal

+0

http://dev.mysql.com/doc/refman/5.0/en/lock-tables.html –

+0

http://stackoverflow.com/questions/917640/any-way-to-select-without-causing-locking -in-mysql?rq = 1 –

回答

1

1.A)無鎖需要
1.B)鎖定表(MyISAM引擎),或者你如果你使用InnoDB引擎

2.A)鎖住讀操作表(有行級鎖直到這個鎖被釋放沒有發生寫操作)
2.B)無鎖需要

由於Lithu電視建議請閱讀DOCS得到所有用例。

0
  1. 據我所知,在mysql中表不會自動鎖定。但這取決於你使用的是什麼。 例如對於SqlTransaction,受影響的表將被鎖定,直到您提交或回滾。

  2. a。你先鎖定表格,這將確保當你讀取表格時,沒有其他人可以鎖定它來寫入,並且你會得到一個死鎖;) 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