【问题标题】:MySQL stored procedure insert validationMySQL 存储过程插入验证
【发布时间】:2019-08-18 03:44:09
【问题描述】:

我有两张桌子acceptancesturnovers。我们假设这些表都只有iddate 列。

我需要能够在 2 个表中插入相同的日期最多 4 次。

例如:5 个用户正在尝试创建预订时间表。

  • 5 个用户中的 3 个创建了接受计划。
  • 5 位用户中有 2 位创建了营业额时间表。

即使在竞争条件下也应拒绝这些插入中的 1 个。

我有以下存储过程:

BEGIN
    DECLARE acceptanceDateEntryCount int;
    DECLARE turnoverDateEntryCount int;

    SELECT COUNT(date) FROM acceptances WHERE DATE(date) = DATE(insertDate) INTO acceptanceDateEntryCount;
    SELECT COUNT(date) FROM turnovers WHERE DATE(date) = DATE(insertDate) INTO turnoverDateEntryCount;

    IF((acceptanceDateEntryCount + turnoverDateEntryCount) < 4) THEN
        INSERT INTO acceptances (date) VALUES (insertDate);
    ELSE
        SIGNAL SQLSTATE
            '45030'
        SET
            MESSAGE_TEXT = 'Cannot create acceptance schedule. Max limit of 4 same date entries are found in acceptances table and turnovers table',
            MYSQL_ERRNO = '45030';
    END IF;
END

注意:此存储过程仅用于创建接受预订。但是还有另一个存储过程是一样的,只是插入到了营业额表中。

这个存储过程是否足以确保即使在许多用户尝试创建预订时间表的竞争条件下,如果存在相同日期的条目,如果插入具有相同的日期,则会被拒绝。

或者我应该放弃这个并使用悲观锁定来确保这些表上的插入不会同时运行?

【问题讨论】:

    标签: mysql database stored-procedures database-design


    【解决方案1】:

    在每个SELECT 语句的末尾加上FOR UPDATE

    还包括

    START TRANSACTION;
    

    COMMIT;
    

    【讨论】:

      猜你喜欢
      • 2021-11-01
      • 1970-01-01
      • 2015-08-16
      • 2014-03-06
      • 2015-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多