这是您可以使用的 SQL 表锁定示例,以便首先获取数据库的第一个 PHP 线程将锁定表(使用锁定名称“awesome_lock_row”),直到它最终释放它。第二个线程尝试使用同一个表,并且由于锁名称也是“awesome_lock_row”),它一直等待直到第一个 PHP 线程解锁该表。
对于此示例,您可以尝试将相同的脚本作为 cron 作业同时运行 100 次,您应该会看到“update_this_data”数字字段增加到 100。如果表没有被锁定,所有并发的 100 个线程可能首先会看到“update_this_data”同时为 0,最终结果将仅为 1 而不是 100。
<?php
$db = new mysqli( 'host', 'username', 'password', 'dbname');
// Lock the table
$db->query( "DO GET_LOCK('awesome_lock_row', 30)" ); // Timeout 30 seconds
$result = $db->query( "SELECT * FROM table_name" );
if($result) {
if ( $row = $result->fetch_object() )
$output = $row;
$result->close();
}
$update_id = $output->some_id;
$db->query( UPDATE table_name SET update_this_data=update_this_data+1 WHERE id={$update_id} );
// Unlock the table
$db->query( "DO RELEASE_LOCK('awesome_lock_row')" );
?>
希望这可以帮助。