我的数据表是使用InnoDB的,现在的情况如下:
表product,里面有很多数据,首先,我把这些数据取出来,然后每条记录都要对远程的web service进行数据请求,根据返回的信息对该记录进行修改,然后再写回到数据表里面。
现在为了防止在对远程web service进行调用的过程中,又产生上面的动作,导致第二次读出来的数据是脏数据,所以想对数据表进行锁定。代码如下,
public function actionRequestdate()
{
$products = Product::model()->findAll();
foreach($products as $key=>$product)
{
$result = "http://www.example.com/auth?r=".$product->id;//这里是用web service进行调用
sleep(100);//因为远程调用是需要时间来进行通信和给web service处理数据的,所以这里让线程sleep一下
$result = json_decode($result);
if(1 == $result['status'])
{
$product->status = 1;
$product->save();
}
}
}
就是说,用户有两个请求,分别为请求A和请求B,都是调用actionRequestdata()这个方法,但它们请求有时间差。
在请求A执行foreach的时候,请求B来了。这时候由于请求A还没有执行完,所以请求B中的$products数据就有可能存在脏数据的情况。
请问如何处理这样的情况,使请求B在执行它的foreach的时候,可以保证$products的数据是最新的。
是要使用锁表来完成这样的事情吗?那这样的话,代码应该怎么写才对呢?
还是有其它更加简单实用的方法呢?
希望大家指点指点。
谢谢~