假设我有一个函数用于在某些情况下将数据库中名为project_id的列加1。 (由于在确定是否增加之前必须运行逻辑,因此假定自动增量不会满足此用例。同步PHP数据库查询
当用户单击“新建项目”,该功能在数据库中查找当前最大的PROJECT_ID,做一些其他的东西,并通过1
递增PROJECT_ID添加行有没有一种可能,当多个用户连接时,服务器处理某个其他消息所需的时间会导致多个用户获取相同的project_id?如果是这样,你会如何去避免这个问题?以这种方式增加是一个坏主意吗?
下面是一个例子。这个例子是基于Laravel的,但这个问题一般适用。
function ReallyLongFunction() {
//figure out what the current max project_id is and increment by 1
$newProjectId = Project::max("project_id")+1;
//Some other stuff that the server has to do. I am exaggerating here the length of time.
//If another user triggers this function, will both users will have the same project id?
sleep(2);
//Insert new row into database
$project = new TempProject;
$project->project_id = $newProjectId;
$project->save();
}
我不是数据库专家,但我会说,是的,这是不好的做法。如果您试图在代码中正确执行自动增量,为什么不自动递增工作? – samrap
每次用户按下“新建项目”按钮时,您可以在数据库中创建一个“草稿”记录,并在取消时刻录新的自动增量ID。 – Scuzzy