MySQL - 如何锁定单行?

MySQL - how to lock a single row?

我的目标是创建一个预订旅行的系统。我的系统内置于 MySQL + PHP。我在 MySQL.

中使用 InnoDB 作为引擎

当用户选择他想预订的行程时,我希望假设页面“*.php”将其中一个行程锁定一段时间(例如 10 分钟),然后在该时间后释放它。

在数据库中锁定行程的最佳方法是什么?

请注意,我没有谈论行或 table,因为我要求 最简单 的方式来实现这种功能,但我不是确定我的是不是那个。所以我尝试设计一个 table 来包含行程,看起来像这样:

CREATE TABLE IF NOT EXISTS Trip (
  id INT(1) NOT NULL AUTO_INCREMENT,
  descr VARCHAR(50) NOT NULL,
  quantity INT(2) NOT NULL DEFAULT 10,
  PRIMARY KEY (id)
) Engine=InnoDB

这是你的票table

CREATE TABLE IF NOT EXISTS Trip (
  id INT(1) NOT NULL AUTO_INCREMENT,
  descr VARCHAR(50) NOT NULL,
  quantity INT(2) NOT NULL DEFAULT 10,
  PRIMARY KEY (id)
) Engine=InnoDB

让我将您的用户 table 想象成这样(仅用于测试)

CREATE TABLE IF NOT EXISTS `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` text COLLATE utf8mb4_unicode_ci NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci AUTO_INCREMENT=1 ;

现在您需要添加一个额外的 table,您可以在其中跟踪您的用户预订订单(示例如下)

CREATE TABLE IF NOT EXISTS `trip_track` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) NOT NULL,
  `trip_id` int(11) NOT NULL,
  `timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci AUTO_INCREMENT=1 ;

现在每次插入预订查询时都需要插入user_id、ticket_id和时间戳(您可以使用日期或Mysql的默认时间戳)

然后,每当用户尝试预订任何机票时,使用查询来检查当前时间与数据库中的时间戳之间的时差

就是这样! .. 看?很简单:)