我正在开发一个 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 会出现差距,但这没关系)