文件锁

多线程处理数据时易出现结果不一致问题,如多线程处理同一订单赠送积分可能重复赠送。可在第一个线程获取订单信息后加排他锁,其他线程获取订单时检查锁状态,有锁则丢弃。锁机制分数据库锁和文件锁,文件锁可封装成函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

用多线程处理数据时,常常会出现数据结果不一致的情况。比如两个线程处理同一个订单赠送积分,可能会赠送两次,这时候我们希望一个订单被一个线程获取后,就不要再被其它线程处理了。我们只需要在第一个线程获取了订单信息后加一个排他锁,其它线程再去获取该订单的时候获取锁状态,如果有锁就会直接丢弃不处理,否者再去处理。

锁机制根据实现方式可以分为数据库锁和文件锁

1,文件锁

$file = '1.lock';
$fp = fopen($file,'a');
if(flock($fp, LOCK_EX|LOCK_NB)){
    echo 'I Get It';
    // do something
    flock($fp, LOCK_UN)
}else{
    echo 'I Lost It'
}


说明:
LOCK_EX 为要取得排它锁,LOCK_NB 为锁定时程序不阻塞 LOCK_UN 为程序处理完后解锁操作

封装成函数


/**
 * 程序锁
 * @param string $operation		锁定操作,默认 1为锁定操作,0 为解锁
 * @param string $name			锁定文件名
 */
function program_lock($operate = 1, $name = 'default'){
    static $fp = null;
    $dir  = './tmp/';
    if(!is_dir($dir)){
        @mkdir($dir,'0777');
    }
    $file = $dir.$name.'.lock';
    if(!is_file($file)){
        touch($file);
    }
    if(is_null($fp)){
        $fp = fopen($file,'r+');
    }
    if(empty($operate)){
        $res = flock($fp, LOCK_UN);
        fclose($fp);
        $fp = null;
        return $res;
    }else{
        if(flock($fp, LOCK_EX | LOCK_NB)){
			return true;
		}else{
			return false;
		}
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值