MySQL/MyISAM中的原子查询

MySQL/MyISAM中的原子查询,mysql,myisam,Mysql,Myisam,假设我想使用MySQL w/MyISAM引擎从表中选择一个最大值,然后根据该值插入一个最大值为+1的新记录(对其应用转换后)。我不希望任何其他事务同时发生,这些事务将读取相同的最大值,然后尝试插入相同的新记录 如何防止这种情况发生 我需要整张桌子吗,还是什么 明确地说,我很确定我不能在这里使用AUTO_INCREMENT,除非我可以将它执行的操作重新定义为比“加一”更复杂的操作。让数据库为您完成这项工作,这样您就不用担心了。使用已经内置的功能 LOCK TABLES `tbl` WRITE;

假设我想使用MySQL w/MyISAM引擎从表中选择一个最大值,然后根据该值插入一个最大值为+1的新记录(对其应用转换后)。我不希望任何其他事务同时发生,这些事务将读取相同的最大值,然后尝试插入相同的新记录

如何防止这种情况发生

我需要整张桌子吗,还是什么



明确地说,我很确定我不能在这里使用
AUTO_INCREMENT
,除非我可以将它执行的操作重新定义为比“加一”更复杂的操作。

让数据库为您完成这项工作,这样您就不用担心了。使用已经内置的功能

LOCK TABLES `tbl` WRITE;
INSERT INTO `tbl` (`id`, `foo`) SELECT MAX(`id`)+1, 'bar' FROM `tbl`;
UNLOCK TABLES;

但如果是标准的主键/ID类型字段,则应使用
AUTO\u INCREMENT

听起来像
AUTO\u INCREMENT
可能有助于you@AlainCollins:这是一个简单的例子。这不仅仅是添加1并插入到同一列中。我正在尽可能地使用人工智能。我说的是“最大值”。从来没有说过我用这个作为主键。另外,我也在对它进行转换。@马克:不要求自动递增的列是主键。据我所知,每个表只允许我使用1个AI,我已经有了一个AI。但同样,这不是重点。@Mark:如果您在最初的问题中陈述了这些要求和限制,那会很有帮助。我道歉。问题是关于原子查询,而不是解决方法或非常特定用例的替代方案,但我应该更清楚我的意图。还是只写锁?为什么我不需要读锁呢?如果另一个查询读取最大值,然后尝试执行插入操作(在删除写锁之后),这不会导致问题吗?根据mysql关于写锁的文档:“只有持有锁的会话才能访问表。在释放锁之前,其他会话无法访问表。”