1

这可能不是现实世界的问题,但更像是一个学习主题。

使用 PHP、MySQL 和 PDO,我对 auto_increment 和 lastInsertId() 了如指掌。考虑到主键没有 auto_incerment 属性,我们必须使用类似SELECT MAX(id) FROM table的东西来检索最后一个 id,手动递增它,然后INSERT INTO table (id) VALUES (:lastIdPlusOne). 将整个代码包装在beginTransactionand中commit

这种方法安全吗?如果用户 A 和 B 同时加载这个脚本,最后会发生什么?两个交易都会失败?或者两者都会成功(例如,如果最后一个 id 是 10,A 将插入 11,B 将插入 12)?

请注意,由于我是一名 PHP 和 MySQL 开发人员,因此我对这种情况下的 MySQL 行为更感兴趣。

4

2 回答 2

0

如果两者都获得相同的最大值,则首先插入的将成功,而其他(s)将失败。

要在不使用 auto_increment 字段的情况下克服这个问题,您可以在插入之前使用触发器来完成这项工作(new.id=max),即相同的逻辑,但在触发器中,因此数据库服务器是控制它的人。

不确定在服务器故障的情况下,这在主-主复制环境中是否 100% 安全。

于 2013-07-03T22:13:26.327 回答
0

这是@eggyal评论,我在这里引用:

您必须确保在第一个(选择)查询中使用锁定读取来获取 MAX();然后它将阻塞,直到事务被提交。但是,这是非常糟糕的设计,不应该在生产系统中使用。

于 2013-08-18T19:14:53.433 回答