假设我想使用带有 MyISAM 引擎的 MySQL 从表中选择一个最大值,然后插入一条新记录与这个最大值 + 1基于此值(对其应用转换后)。我不希望同时发生任何其他事务,这些事务将读取相同的最大值,然后尝试插入相同的新记录。
我该如何防止这种情况发生?
我需要锁定整个表,还是什么?
需要明确的是,我相当肯定我不能AUTO_INCREMENT
在这里使用,除非我可以将它执行的操作重新定义为比“加一”复杂得多的东西。
LOCK TABLES `tbl` WRITE;
INSERT INTO `tbl` (`id`, `foo`) SELECT MAX(`id`)+1, 'bar' FROM `tbl`;
UNLOCK TABLES;
AUTO_INCREMENT
但如果它是标准主键/ID 类型字段,则应使用。
让数据库为您完成工作,这样您就不必担心这一点。使用已经内置的auto_increment功能。