$sql_info=mysql_query("SELECT * FROM task WHERE end=0 limit 0,1");
if($sql_row=mysql_fetch_array($sql_info))
{
mysql_query("update task set end=1 where id=".$sql_row['id']);
}用上面的代码获取任务的 会出现多个用户获取的同一个任务如果我根据网上查的锁表 改成
SET AUTOCOMMIT=0;
BEGIN WORK;
SELECT * FROM task WHERE end=0 limit 0,1 FOR UPDATE;
"update task set end=1 where id=".$sql_row['id'])
COMMIT WORK;
那么我的end不是主键 会导致整个表锁住 那么我需要对所有查询task表的SQL上加上FOR UPDATE操作
如果不对所有查询task表的SQL上加上FOR UPDATE操作 那么 很有可能出现 这种执行顺序
//------------------------------A.php
SELECT * FROM task WHERE id='123'
//------------------------------A.php
//------------------------------B.php
SET AUTOCOMMIT=0;
BEGIN WORK;
SELECT * FROM task WHERE end=0 limit 0,1 FOR UPDATE;
//----------------------------B.php
//----------------------------A.php
update task set w='999' where id='123'/ 理论上A.PHP执行完这句B.php的就解锁了
//---------------------------A.php所有查询task表的SQL上加上锁 那么好麻烦啊 我要判断SELECT * FROM task WHERE end=0 limit 0,1 如果是空 那么还要解锁
不然整个表锁住了 我感觉工程量大 而且执行效力应该很低$sql_info=mysql_query("SELECT * FROM task WHERE end=0 limit 0,1");
if($sql_row=mysql_fetch_array($sql_info))
{
mysql_query("update task set end=1 where id=".$sql_row['id']);
}
这端代码要怎么优化才能让一个用户获得一个任务呢?求更好的办法
你的问题应通过调整业务流程来解决
1、产生 end=0 的 id 列表,供用户选择
2、检查用户选中的 id 是否 end=1 了