插入还是重复了,改成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();
        }
    }
}
“改成一个进程就好了”,因为单进程所有请求都是“串行”的。加不加锁已经无所谓了。
按你的描述,“判断”和“更改”应当视为一个不可分割的操作,要么查询之前请求锁,要么加锁后再查询一次,否则数据不安全。
查询之前就加锁