对于已被另一个会话锁定(写入)的表上的mysql SELECT查询,结果是什么?

时间:2013-08-10 10:51:14

标签: mysql locking

一切都在标题中......

如果我使用:

LOCK TABLE tableA WRITE
commands
UNLOCK TABLES

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

mysql会以错误的方式响应"错误xxx这个表被锁定了!稍后重试"或者mysql会自动等待表解锁吗?多久?如果表长时间保持锁定状态,mysql会响应超时错误吗?

btw我也想知道这种情况是否会发生:

LOCK TABLE tableA WRITE

然后php / mysql崩溃

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

1 个答案:

答案 0 :(得分:3)

刚刚用一些PHP进行了测试:

第一点:

让我们使用以下脚本:

  • 锁定表格
  • 调用另一个尝试在同一个表上执行select的脚本 (在带有$ 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自动结束时就完成了。