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 查询;
备注:
- 我没有创建这个 table。
- 我可能不会更改 table。
请注意,锁定仅在您的数据库会话期间有效 - 在本例中为您的脚本调用期间。
当您编写 sql 查询时,您应该用反引号而不是单引号将 table| 列名括起来。
你的情况
mysqli_query($conn, "LOCK TABLES `invoices` WRITE");
注意 但我建议您停止尝试 "resolve" 赛车状态。为什么你认为这是你的问题?
赛车条件对于某些项目来说可能是个大问题。但我怀疑这是你的情况。我会支持@Dave 评论,你已经有了自动递增的索引。在许多情况下,这已经足够了。
恕我直言,您不需要这个 "locks"。
INSERT INTO `invoices` (`invoice_id`) SELECT MAX(`invoice_id`)+100 FROM `invoices`
这个查询几乎没有意义。你能解释一下你为什么要尝试做这个奇怪的插入吗?
我的'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 查询;
备注:
- 我没有创建这个 table。
- 我可能不会更改 table。
请注意,锁定仅在您的数据库会话期间有效 - 在本例中为您的脚本调用期间。
当您编写 sql 查询时,您应该用反引号而不是单引号将 table| 列名括起来。
你的情况
mysqli_query($conn, "LOCK TABLES `invoices` WRITE");
注意 但我建议您停止尝试 "resolve" 赛车状态。为什么你认为这是你的问题?
赛车条件对于某些项目来说可能是个大问题。但我怀疑这是你的情况。我会支持@Dave 评论,你已经有了自动递增的索引。在许多情况下,这已经足够了。
恕我直言,您不需要这个 "locks"。
INSERT INTO `invoices` (`invoice_id`) SELECT MAX(`invoice_id`)+100 FROM `invoices`
这个查询几乎没有意义。你能解释一下你为什么要尝试做这个奇怪的插入吗?