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