管理逻辑约束以处理mySQL数据库插入中的并发性

管理逻辑约束以处理mySQL数据库插入中的并发性,mysql,concurrency,semaphore,sql-insert,Mysql,Concurrency,Semaphore,Sql Insert,我将创建一个预订系统。在这个系统中,有些人的能力有限,无法在规定的时间内与人会面。例如,在周日8:00到12:00之间,A个人最多可以与8个人开会 在我的数据库中,我有两个关于这一点的表:Timings,它显示预定义的日程安排;和Bookings,它显示固定的预订。 这些表格的定义如下: CREATE TABLE IF NOT EXISTS `Timings` ( `id` int(11) NOT NULL AUTO_INCREMENT, `day` varchar(100) COLLA

我将创建一个预订系统。在这个系统中,有些人的能力有限,无法在规定的时间内与人会面。例如,在周日8:00到12:00之间,A个人最多可以与8个人开会

在我的数据库中,我有两个关于这一点的表:
Timings
,它显示预定义的日程安排;和
Bookings
,它显示固定的预订。 这些表格的定义如下:

CREATE TABLE IF NOT EXISTS `Timings` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `day` varchar(100) COLLATE utf8_persian_ci NOT NULL,
  `start_time` int(11) NOT NULL,
  `end_time` int(11) NOT NULL,
  `capacity` int(11) NOT NULL,
  `personFK` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `fk_person_timing` (`personFK`),
  KEY `id` (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_persian_ci  AUTO_INCREMENT=12 ;



CREATE TABLE IF NOT EXISTS `Bookings` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` varchar(100) COLLATE utf8_persian_ci NOT NULL,
  `order` int(11) NOT NULL,
  `booking_code` varchar(100) COLLATE utf8_persian_ci NOT NULL,
  `timingFK` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `fk_booking_timing` (`timingFK`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_persian_ci AUTO_INCREMENT=1 ;
因此,当我要预订新会议时,我应该检查
Bookings
表中与指定时间相关的行数是否小于允许新预订的容量

这是一个必要条件,但在发生并发时,这是不够的。
我的意思是,如果我检查最后一次可用预订的(timing,其中timingFK=XXX)计数,可能会发生两人同时预订的情况,因为当他们检查条件时,最后一次预订仍然可用。我想知道如何实现类似信号灯的功能,以避免在插入新预订时两个人预订最后一个离开的位置?

为了最大的安全性,请使用事务+

对于搜索遇到的索引记录,请选择。。。用于更新锁 行和任何关联的索引项,与发出 这些行的UPDATE语句。其他交易被阻止 从更新这些行,从执行选择。。。锁定在共享模式,或 从某些事务隔离级别读取数据。 一致读取将忽略在中存在的记录上设置的任何锁 阅读视图。(无法锁定记录的旧版本;它们是 通过将撤消日志应用于 记录。)

所以你可能有

START TRANSACTION;
SELECT COUNT(*) FROM Bookings WHERE somecondition FOR UPDATE
INSERT INTO timings ...
UPDATE Bookings ....
COMMIT;

为获得最大安全性,请使用事务+

对于搜索遇到的索引记录,请选择。。。用于更新锁 行和任何关联的索引项,与发出 这些行的UPDATE语句。其他交易被阻止 从更新这些行,从执行选择。。。锁定在共享模式,或 从某些事务隔离级别读取数据。 一致读取将忽略在中存在的记录上设置的任何锁 阅读视图。(无法锁定记录的旧版本;它们是 通过将撤消日志应用于 记录。)

所以你可能有

START TRANSACTION;
SELECT COUNT(*) FROM Bookings WHERE somecondition FOR UPDATE
INSERT INTO timings ...
UPDATE Bookings ....
COMMIT;