webman 多进程业务锁,并发测试 重复记录?

蚂蚁搬家

问题描述

插入还是重复了,改成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();
        }

    }
}
237 1 0
1个回答

胡桃

“改成一个进程就好了”,因为单进程所有请求都是“串行”的。加不加锁已经无所谓了。

按你的描述,“判断”和“更改”应当视为一个不可分割的操作,要么查询之前请求锁,要么加锁后再查询一次,否则数据不安全。

🔝