MyISAM 赛车条件/LOCK TABLES

MyISAM racing conditions / LOCK TABLES

我的'invoices'table:

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 在 "locked" table 中插入新行锁定期间的控制台。

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

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

可以成功防止竞争条件,因此使用它而不是 LOCK TABLES 查询;

备注:

请注意,锁定仅在您的数据库会话期间有效 - 在本例中为您的脚本调用期间。

当您编写 sql 查询时,您应该用反引号而不是单引号将 table| 列名括起来。

你的情况

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

注意 但我建议您停止尝试 "resolve" 赛车状态。为什么你认为这是你的问题?

赛车条件对于某些项目来说可能是个大问题。但我怀疑这是你的情况。我会支持@Dave 评论,你已经有了自动递增的索引。在许多情况下,这已经足够了。

恕我直言,您不需要这个 "locks"。

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

这个查询几乎没有意义。你能解释一下你为什么要尝试做这个奇怪的插入吗?