一切都在标题中......
如果我使用:
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命令。
答案 0 :(得分:3)
刚刚用一些PHP进行了测试:
第一点:
让我们使用以下脚本:
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自动结束时就完成了。