我的“发票”表:
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查询;
注意:
答案 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`
该查询几乎没有意义。您能解释一下为什么要尝试执行此奇怪的插入操作吗?