刚刚用一些 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 自动结束时完成的。