同步PHP数据库查询


Simultaneous PHP Database Query

假设我有一个函数,用于在某些情况下将数据库中名为project_id的列增加1。(假设自动增量将不满足此用例,因为在确定是否增量之前必须运行逻辑)。

当用户点击"新建项目"时,该函数在数据库中找到当前最大的project_id,做一些其他的事情,并通过将project_id增加1来添加一行。

是否有可能,当多个用户连接,时间,服务器需要处理一些其他的东西,导致多个用户拿起相同的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();
}

在自己的代码中做sql server内部可以做得更好的事情总是一个坏主意。$newProjectId = Project::max("project_id")+1;听起来很像auto_increment的替代品。但是,如果您的需求比这更复杂,则需要锁

[LOW_PRIORITY] WRITE lock:

持有锁的会话可以对表进行读写操作。

只有持有锁的会话才能访问表。没有其他的会话可以访问它,直到锁被释放。

在WRITE操作时,其他会话阻塞对表的锁请求

如果是写锁,LOW_PRIORITY修饰符会影响锁调度请求必须等待,如下所述。

如果LOCK TABLES语句由于锁被其他语句持有而必须等待任何表上的会话,它都会阻塞,直到所有锁都可以收购。

如果很多用户同时访问同一个页面,响应将开始变慢,因为第二个请求在第一个请求完成之前无法服务。