我将一个文件保存到服务器,并将文件名、上传该文件的个人的用户id以及有关该文件的各种其他信息保存到PostgreSQL数据库。理想情况下,我希望以一种类似于数据库事务的方式来构建它。也就是说,应该出现以下情况之一:
- 保存文件
- 如果成功,将信息保存到数据库
- 如果保存信息到数据库失败,删除文件
或
- 保存信息到数据库
- 如果成功,保存文件
- 如果保存文件失败,从数据库中删除信息
这个方法的唯一问题是步骤3可能会失败——也就是说,您可能保存了一个文件,但数据库中没有相应的信息,或者您可能有数据库信息,但没有保存相应的文件。
我想知道的是,是否有一种方法可以使用上述两种方法中的任何一种,同时确保步骤3总是发生,或者以足够的可靠性发生,从而我有效地不必担心失败。
请注意,我使用的是PostgreSQL数据库,并使用GD库中的imagegif
, imagejpeg
和imagepng
函数保存映像文件。
编辑
为了回应下面Jack的坚实评论,我忘了提到我是通过API服务器与DB交互的,所以我不是直接与DB交互,而是向API发送REST请求,API反过来与DB交互。这实际上意味着我不能将两个数据库交互放在一个事务中。
我不确定你想要什么,但也许像这样:
if(move_uploaded_file(...)){
if(!mysql_query(...)){
unlink(...);
}
}
如果我没有理解你的问题,或者我对你的问题一直很宽容,请原谅我。
我决定选择一种次优但仍然可行的路线,即运行定期检查,为每个文件名搜索数据库条目,如果无法找到数据库条目,则删除该文件。(如果有人真的对代码细节感兴趣,我很乐意在编辑中提供。)