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的默认时间戳)
然后,每当用户尝试预订任何机票时,使用查询来检查当前时间与数据库中的时间戳之间的时差
就是这样! .. 看?很简单:)
我的目标是创建一个预订旅行的系统。我的系统内置于 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的默认时间戳)
然后,每当用户尝试预订任何机票时,使用查询来检查当前时间与数据库中的时间戳之间的时差
就是这样! .. 看?很简单:)