我使用带有 IF 验证的 FOR UPDATE 锁定了表。但是,他们似乎无法处理并行请求?
我有两个存储过程示例。我使用 cURL 测试了这些以发出并行请求。
DROP PROCEDURE IF EXISTS SAMPLE;
DELIMITER //
CREATE PROCEDURE SAMPLE(_quantity INT)
BEGIN
DECLARE _total INT DEFAULT 0;
SELECT COALESCE(SUM(price),0) + _quantity INTO _total FROM account FOR UPDATE;
IF(_total <= 50) THEN
CALL SAMPLE2(_quantity);
ELSE
SELECT 'EXCEEDED';
END IF;
END; //
DELIMITER ;
DROP PROCEDURE SAMPLE2;
DELIMITER //
CREATE PROCEDURE SAMPLE2(_quantity INT)
BEGIN
INSERT INTO account(price) VALUES(_quantity);
END; //
DELIMITER ;
根据我的验证,我希望输出不超过 50。
日志输出:
CALL SAMPLE(?) [ [ RowDataPacket { _total: 20, _quantity: 20, 'now()': 2019-07-22T08:33:27.000Z } ],
CALL SAMPLE(?) [ [ RowDataPacket { _total: 20, _quantity: 20, 'now()': 2019-07-22T08:33:27.000Z } ],
CALL SAMPLE(?) [ [ RowDataPacket { _total: 40, _quantity: 20, 'now()': 2019-07-22T08:33:27.000Z } ],
CALL SAMPLE(?) [ [ RowDataPacket { _total: 80, _quantity: 20, 'now()': 2019-07-22T08:33:28.000Z } ],
[ RowDataPacket { EXCEEDED: 'EXCEEDED' } ],
CALL SAMPLE(?) [ [ RowDataPacket { _total: 80, _quantity: 20, 'now()': 2019-07-22T08:33:28.000Z } ],
[ RowDataPacket { EXCEEDED: 'EXCEEDED' } ],
CALL SAMPLE(?) [ [ RowDataPacket { _total: 80, _quantity: 20, 'now()': 2019-07-22T08:33:28.000Z } ],
[ RowDataPacket { EXCEEDED: 'EXCEEDED' } ],
在第二次通话中,他们似乎没有读取插入的值。
数据已插入。
+----+-------+---------------------+
| id | price | created |
+----+-------+---------------------+
| 1 | 20 | 2019-07-25 13:44:51 |
| 2 | 20 | 2019-07-25 13:44:51 |
| 3 | 20 | 2019-07-25 13:44:51 |
+----+-------+---------------------+
我需要的是价格的总和 <= 50。但上面的输出显示为 60。