thinkphp一貫操作ロックの詳細についてlock
thinkphpの公式サイトの上のロックの紹介はあまり詳しくありません.まず、データベースのタイプがInnoDBであれば、次に、ロックはトランザクションと同時に使用しなければなりません.また、クエリーの時にロックを持っていなければなりません.例えば:$user_mod->lock(true)->where('id=1')->select();ここではロッククエリーを使用します.次に、このuserオブジェクトをクエリーするときに同時操作を防止する必要がある場合は、ロック(true)という方法でクエリーを行います.コードの例は次のとおりです.
lock(true)を付けるのは、実際にはクエリー文の最後にfor updateを付けることです.次のような方法でテストすることができます.2つのウィンドウを開き、1つのウィンドウでトランザクションを開き、1つのデータをクエリーしてロックし、もう1つのウィンドウで再びこのデータをクエリーしてロックすると、最初のウィンドウのトランザクションがコミットされるまで別のウィンドウのクエリーが待機することがわかります.図:
M()->startTrans();//
$map['userid']='test';//
$user = M('User')->lock(true)->where($map)->find();//
if($user)
{
// , result
$result = true;
if(!$result)
{
M()->rollback();//
$this->error(' ');
}
}
M()->commit();//
$this->success(' ');
lock(true)を付けるのは、実際にはクエリー文の最後にfor updateを付けることです.次のような方法でテストすることができます.2つのウィンドウを開き、1つのウィンドウでトランザクションを開き、1つのデータをクエリーしてロックし、もう1つのウィンドウで再びこのデータをクエリーしてロックすると、最初のウィンドウのトランザクションがコミットされるまで別のウィンドウのクエリーが待機することがわかります.図: