3

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

我该如何防止这种情况发生?

我需要锁定整个表,还是什么?


需要明确的是,我相当肯定我不能AUTO_INCREMENT在这里使用,除非我可以将它执行的操作重新定义为比“加一”复杂得多的东西。

4

2 回答 2

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

AUTO_INCREMENT但如果它是标准主键/ID 类型字段,则应使用。

于 2012-09-14T21:23:07.617 回答
1

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

于 2012-09-14T21:21:54.957 回答