2

我使用带有 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。

4

0 回答 0