【问题标题】:MySQL - how to lock a single row?MySQL - 如何锁定单行?
【发布时间】:2015-12-09 09:46:45
【问题描述】:

我的目标是创建一个系统来预订旅行。我的系统是内置在 MySQL + PHP 中的。我在 MySQL 中使用 InnoDB 作为引擎。

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

在 DB 中锁定行程的最佳方式是什么?

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

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

【问题讨论】:

  • 我会在那个表中设置一个标志,我们称之为locked (timestamp),在“ipothetic page.php”中设置它now。下次您要访问该行时,请检查 now 减去保存的时间戳是否大于 10 分钟,...明白我的想法了吗?
  • ...不使用 MySQL 框架的 transaction nor LOCK 并在表,如果时间戳和“现在”之间的差异大于 10 分钟,则更新该行中的该列!有你的想法吗? :)
  • 但这不符合我的目标。想象一下这种情况:我有 10 个用户正在寻找相同的行程,所以他们锁定了他们。第 11 个用户将看到没有可用的行程。相反,在您的场景中,除一个之外的所有用户都可以预订行程。
  • @AniruddhaChakraborty 完成,非常抱歉这个错误。
  • 和我为这种有效的问题+1,这种问题对新程序员真的很有帮助

标签: mysql transactions locking create-table


【解决方案1】:

这是您的票务表

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

让我把你的用户表想象成这样(只是为了测试)

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 ;

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

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的默认时间戳)

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

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

【讨论】:

  • 不错的答案。 “现在每次插入预订查询时都需要插入 user_id、ticket_id 和时间戳”。如果他们想作为附加选项,他们可以使用触发器(使事情自动化)。
  • 是的,触发器也是不错的选择。
猜你喜欢
  • 2012-02-22
  • 2011-04-22
  • 1970-01-01
  • 2017-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-02
相关资源
最近更新 更多