在公司做的一个红包系统中出现了并发同步问题,原本应该有唯一性的数据出现了重复,究其原因是因为PHP在判断用户的发放记录时出现了脏读,因此导致数据库的数据出问题,因为PHP没有进程锁的机制,所以参考网上资料使用PHP的文件锁,对并发进程进行锁定来强制同步。

1
2
3
4
5
6
7
8
9
<?php
$fp = fopen("lock.txt", "w+");
if(flock($fp,LOCK_EX))
{
//..处理订单
flock($fp,LOCK_UN);
}
fclose($fp);

如果并发数多的情况下,并且数据不是很敏感可以考虑采用非阻塞文件锁进行同步

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
$fp = fopen("lock.txt", "w+");
if(flock($fp,LOCK_EX | LOCK_NB))
{
//..处理订单
flock($fp,LOCK_UN);
}
else
{
echo "系统繁忙,请稍后再试";
}
fclose($fp);

参考:
php解决下单、抽奖并发导致的库存负数的问题