FOR UPDATE 仅适用于InnoDB,且必须在事务区块(BEGIN/COMMIT)中才能生效。
InnoDB 预设是Row-Level Lock (行级锁),FOR UPDATE 需要指定明确的主键才会行级锁,否则为表级锁,如:
select from user where id = 1 (行级锁)
select from user where id > 1 (表级锁)
操作完成后无需手动解锁,会自动解锁
创建表:
CREATE TABLE `tp_test` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`num` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
INSERT INTO `tp_test` VALUES ('1', '10');测试代码:
public function test()
{
Db::startTrans();
$info = Db::name('Test')->where('id',1)->lock(true)->find();
if($info['num'] > 0){
sleep(1);
$status = Db::name('Test')->where('id',1)->setDec('num');
$text = var_export($status,true) . PHP_EOL;
file_put_contents('test.txt',$text,FILE_APPEND);
if($status){
Db::commit();
echo 'success';
}else{
Db::rollback();
echo 'fail';
}
}else{
echo 'fail';
}
}使用apache AB工具测试:
//模拟100个并发 ab -n 100 -c 100 http://tp5.com/test/test
转载请注明本文标题和链接:《 TP5 悲观锁LOCK的使用 》



网友评论 0