显然是按照以下方式:http://www.tuxradar.com/practicalphp/9/4/9
在发出致电mysql_unbuffered_query()的时间到 您的最后一行处理,该表仍被mysql锁定,并且 无法通过其他查询写入。如果您打算冗长 在每一行上进行处理,这不好。
所以我试图模拟这一点。请注意,使用mysqli_use_result是使用未封闭查询的同义词。另请注意,表中大约有60000个现有条目。
所以我有此代码:
$use_buffer = FALSE;
$buffer = $use_buffer ? "SQL_BUFFER_RESULT" : "";
$query = "SELECT $buffer * FROM table";
$result = mysqli_query($db, $query, MYSQLI_USE_RESULT);
$inserted = FALSE;
$i = 0;
$rand = rand();
while($r = mysql_fetch_object($result)){
if(!$inserted){
mysqli_query($db, 'INSERT INTO table (something, somethingint) VALUES ('NewValue' . $rand . '', 1)');
print('INSERTEDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD');
$inserted = TRUE;
}
if(!($i % 500)){
$j = mysql_fetch_object(mysqli_query($db, "SELECT * FROM table WHERE something = 'NewValue$rand'"));
print_r($j);
print('still outputting');
print_r($r);
}
$i++;
if($i > 5000){
break;
}
}
mysql_free_result($result);
但是,随后,代码设法将新行插入表中,此外,即使应该锁定表,直到我完成所有行。
为什么会发生这种情况?我想念什么吗?
该博客中提到的锁定仅适用于Myisam存储引擎。
如果将表定义为使用InnoDB存储引擎(由于MySQL 5.5,这是默认的存储引擎),则该原理适用于读取器不会阻止作者。
即。普通的SELECT
在Innodb中不锁定任何内容。
您的评论:
myisam有一个特殊的插入案例,即使插入插入附加到数据末尾,您也可以在该表中插入表格。
https://dev.mysql.com/doc/refman/5.6/en/optimizing-queries-meries-myisam.html说:
myisam支持并发插入:如果表格中间没有一个自由块,则可以在其他线程从表中读取的同时将新行插入其中。