您的位置:时间博客>More>数据库>TP5 悲观锁LOCK的使用

TP5 悲观锁LOCK的使用

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

未登陆 表情
Ctrl+Enter快速提交