$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']);
  }

这端代码要怎么优化才能让一个用户获得一个任务呢?求更好的办法