插入还是重复了,改成1个进程就好了
使用AB并发测试
ab -n 100 -c 10 -p 'post.txt' -T 'application/json' 'http://127.0.0.1:8989/api/pay'
数据库 变更前 变更额 变更后
1 1000 -20 980
2 1000 -20 980
3 980 -20 960
<?php
namespace app\controller;
use yzh52521\WebmanLock\Locker;
class Cash {
public function changeCash()
{
// 查询 Redis 余额
$balance = Redis 余额;
$amount = 20;
$newBalance = $balance - $amount;
if ($newBalance < 0) {
throw new BadRequestHttpException('余额不足');
}
$lock = Locker::lock($key);
if (!$lock->acquire()) {
throw new \Exception('操作太频繁');
}
try {
// 插入消费日志
// 更新Redis 余额信息 $newBalance
} finally {
$lock->release();
}
}
}
“改成一个进程就好了”,因为单进程所有请求都是“串行”的。加不加锁已经无所谓了。
按你的描述,“判断”和“更改”应当视为一个不可分割的操作,要么查询之前请求锁,要么加锁后再查询一次,否则数据不安全。
查询之前就加锁