0

我正在开发一个 PHP 脚本,该脚本处理文件并将有关文件的信息插入到数据库中。

具体来说,脚本会处理一些信息,然后开始事务并将其插入表中。然后我lastinsertid用来获取ID刚刚插入的行,并ID在处理相关文件时使用它。处理完成后(需要 2-30 秒),我在其他表中再插入一些内容,并在检查文件处理成功后完成事务。

所以基本上纲要是这样的:

START TRANSACTION

INSERT DATA INTO TABLE 1

PROCESS FILE USING INSERT ID (takes 2-30 seconds)

INSERT DATA INTO TABLE 2

INSERT DATA INTO TABLE 3

INSERT DATA INTO TABLE 4

//VERIFY FILE PROCESSING    
  if ($file_process == true){   
COMMIT   
}   
else{   
ROLLBACK   
}   

我知道由于长时间持有锁的问题,应该避免长事务,但是如果事务只使用插入怎么办。由于插入只锁定正在插入的行,这仍然是一个问题吗?

有人可以向我解释这种情况可能产生的潜在“陷阱”吗?我很确定,如果一个会话的进程需要很长时间,而另一个会话开始自己的进程,session 1则不会阻塞session 2,因为这些进程只处理插入。如果session 1失败并且必须回滚,它将对session 2任何内容都没有影响(除了在数据库中,自动递增的主 ID 会出现差距,但这没关系)

4

3 回答 3

0

如果您在 PHP 脚本中插入数据库的运行时间达到 30 秒,您可能会遇到 PHP 的最大执行时间上限。

您可以通过以编程方式更改时间限制来缓解这种情况。

http://php.net/manual/en/function.set-time-limit.php

或者

您可以修改 php.ini 文件以更改默认值。如果这成为问题,我建议您只修改数据库调用,以免与数据库无关的失控脚本阻塞服务器资源。

于 2013-04-12T19:15:46.803 回答
0

如果您不确定在那里使用事务,我建议您在new_added_row那里使用额外的列,如果出现问题,您只需删除new_added_row=1列以回滚您的事务。您仍将获得该 insert_id,并且不使用事务,并且能够回滚更改。如果多个用户会异步执行此操作,您可能会考虑使用 `session_key 额外列来防止删除其他人的插入。

于 2013-04-12T19:16:13.370 回答
0

由于插入只锁定正在插入的行,这仍然是一个问题吗?

不总是。如果您在明细表中插入记录,主记录也会被锁定。如果您有许多关系,则很难意识到究竟锁定了什么,这反过来可能会导致死锁。

于 2013-04-12T18:58:23.493 回答