MyISAM赛车状况/锁定表

时间:2019-03-20 18:29:49

标签: php mysql mysqli myisam

我的“发票”表:

CREATE TABLE `invoices` (
 `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
 `invoice_id` int(11) NOT NULL,
 PRIMARY KEY (`id`,`invoice_id`),
 UNIQUE KEY `invoice_id` (`invoice_id`),
 KEY `order_id` (`order_id`)
) ENGINE=MyISAM AUTO_INCREMENT=115 DEFAULT CHARSET=utf8

当我尝试查询时:

mysqli_query($conn, "LOCK TABLES 'invoices' WRITE");

在php脚本中,它不起作用,因为我可以在锁定期间使用phpMyAdmin的SQL控制台在“锁定”表中插入新行。

我可以完全相信这样的查询

INSERT INTO `invoices` (`invoice_id`) SELECT MAX(`invoice_id`)+100 FROM `invoices`

可以成功地阻止竞争条件,因此可以使用它代替LOCK TABLES查询;

注意:

  • 我没有创建此表。
  • 我不能更改表格。

2 个答案:

答案 0 :(得分:0)

请注意,锁定仅在数据库会话期间(在这种情况下,在脚本调用期间)持续。

答案 1 :(得分:0)

在编写sql查询时,应该在表名的后面加上反斜杠,但不要在单引号前。

以您的情况

 mysqli_query($conn, "LOCK TABLES `invoices` WRITE");

注意,但我建议您停止尝试“解决”赛车状况。为什么您认为这是您的问题?

竞赛条件对于某些项目可能是个大问题。但我怀疑这是您的情况。我会支持@Dave注释,您已经有自动递增的索引。在许多情况下,这绰绰有余。

天哪,您不需要这个“锁”。

INSERT INTO `invoices` (`invoice_id`) SELECT MAX(`invoice_id`)+100 FROM `invoices`

该查询几乎没有意义。您能解释一下为什么要尝试执行此奇怪的插入操作吗?