1

一切都在标题中...

如果我使用:

LOCK TABLE tableA WRITE
commands
UNLOCK TABLES

如果另一个会话/用户尝试在此表上进行 SELECT 查询会发生什么?我在 mysql 文档中找不到它...

mysql 会以“错误 xxx 此表已锁定!稍后重试”的错误响应,还是 mysql 会自动等待表解锁?多久?如果表长时间锁定,mysql会响应超时错误吗?

顺便说一句,我也想知道这种情况是否会发生:

LOCK TABLE tableA WRITE

然后 php/mysql 崩溃

所以 tableA 保持 LOCKED 'FOREVER' 直到 mysql 收到 UNLOCK TABLES 命令。

4

1 回答 1

3

刚刚用一些 PHP 测试了它:

第一点:

让我们使用一个脚本:

  • 锁定表
  • 调用另一个脚本,该脚本将尝试在同一个表上进行选择 (在同一个文件中使用 $argc 上的开关完成)

foo.php:

function showTableLocked( $link, $table )
{
    $query = mysqli_query( $link, "SHOW OPEN TABLES WHERE `Table` LIKE '$table'" );

    $data = mysqli_fetch_assoc( $query );

    echo "Is table locked ? :". (($data['In_use'] == '1' )? 'yes' : 'no' )."\n";
}



// Show table status
showTableLocked( $link, $table );

if ( $argc == 1 )
{
    // Lock the table
    mysqli_query( $link,  "LOCK TABLE $table WRITE" );

    // Check lock
    showTableLocked( $link, $table );

    echo "Call a concurrent script\n";
    echo "----------------\n";
    passthru( 'php '.__FILE__.' --no-recursion' );

    echo -"---------------\n";

}
else
{
    echo "Let's try to SELECT something\n";

    // Select something
    $query = mysqli_query( $link, "SELECT COUNT(*) AS foo FROM $table" );

    $data = mysqli_fetch_assoc( $query );

    echo "My SELECT result: ". $data['foo']."\n";

}


// Is table still locked ?    
showTableLocked( $link, $table );





// EOF

执行输出:

$ php foo.php 
Is table locked: no
Is table locked: yes
Call a concurrent script
----------------
Is table locked: yes
Let's try to SELECT something

而且我必须停止脚本,因为第二个调用正在等待删除锁。所以 SELECT 是不可能的。

对于第二点:

foo.php

// include showTableLocked func def and init vars...
//

// Show table status
showTableLocked( $link, $table );

// Lock the table
mysqli_query( $link,  "LOCK TABLE $table WRITE" );

// Check lock
showTableLocked( $link, $table );

// Cal an undefined function to make PHP crash
GenerateSommeFatalError();

请注意,我没有解锁表,也没有关闭数据库连接。

第一次执行给出:

$ php foo.php 
Is table locked: no
Is table locked: yes
PHP Fatal error:  Call to undefined function GenerateSommeFatalError() in foo.php on line xxx

第二次执行给出了完全相同的输出,尤其是第一次测试:

$ php foo.php
Is table locked: no

所以看起来表是自动解锁的,我猜它是在 mysqli 连接被 PHP 自动结束时完成的。

于 2013-08-10T11:43:55.740 回答