每次请求/运行此脚本时,我都会创建一个获取mysql MyISAM表数据的脚本。 查询是这样的:
SELECT * FROM table LIMIT $ offset,10;
问题是$ offset在第一个请求中必须为0,在第二个请求中为10,在第三个请求中为20等。 然后我创建了一个新表,我有一个$ offset的计数器,每次该脚本增加+10 请求。
您必须知道该脚本会同时有很多请求。请求不是用户(访问) 请求是我的软件在超过5台PC上运行,并且这些软件中的每一台都运行着 超过1000个线程对此脚本发出请求。然后我搜索一个不返回的解决方案 如果两个或多个线程将同时完全请求此脚本,则对这些线程产生相同的结果。 我还需要那个计数器增加完美。
function GetAndUpdateCounter($numberToAdd)
{
$link = mysql_connect('localhost','root','abcd1234');
if(!$link) die ('Could not connect to database: '.mysql_error());
mysql_select_db('dbcounter',$link);
// in the 2 lines below I have my question about what happend if 2 or
// more threads/request do this at same time, will get same result and will do same update
$result = mysql_query("SELECT id FROM counter");
mysql_query("UPDATE counter SET id=(id+$numberToAdd);");
$row = mysql_fetch_array($result, MYSQL_ASSOC);
mysql_close($link);
return $row['id'];
}
调用函数
的示例$offset = GetAndUpdateCounter(10);
$ q = mysql_query(" SELECT * FROM table LIMIT $ offset,10");
答案 0 :(得分:0)
在列出您的问题的解决方案之前,我想给您一些建议:请不要,请不要使用mysql_函数,它们可能有害并且在最新的PHP版本。
有几种方法可以达到你想要的效果。我会按优先顺序列出它们。
手动MySQL表锁。您可以锁定表,选择+更新所需的值,然后再次解锁表。我首先在优先级列表中选择它的原因是,它具有良好的内部锁定系统,具有高效率。原型,取自MySQL的手册页:
LOCK TABLES trans READ, customer WRITE;
SELECT SUM(value) FROM trans WHERE customer_id=some_id;
UPDATE customer
SET total_value=sum_from_previous_statement
WHERE customer_id=some_id;
UNLOCK TABLES;