MySQL 存储过程插入验证
Posted
技术标签:
【中文标题】MySQL 存储过程插入验证【英文标题】:MySQL stored procedure insert validation 【发布时间】:2019-08-18 03:44:09 【问题描述】:我有两张桌子acceptances
和turnovers
。我们假设这些表都只有id
和date
列。
我需要能够在 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
注意:此存储过程仅用于创建接受预订。但是还有另一个存储过程是一样的,只是插入到了营业额表中。
这个存储过程是否足以确保即使在许多用户尝试创建预订时间表的竞争条件下,如果存在相同日期的条目,如果插入具有相同的日期,则会被拒绝。
或者我应该放弃这个并使用悲观锁定来确保这些表上的插入不会同时运行?
【问题讨论】:
【参考方案1】:在每个SELECT
语句的末尾加上FOR UPDATE
。
还包括
START TRANSACTION;
和
COMMIT;
【讨论】:
以上是关于MySQL 存储过程插入验证的主要内容,如果未能解决你的问题,请参考以下文章