PHP在代码中怎么保证原子性

  • 业务场景 : 同时上传多集电视剧到oss,并把每集剧的信息保存到数据库中
  • 问题描述 : 由于网络的不稳定性,可能存在数据库写入成功,上传oss失败的情况(上传成功,数据库写入失败也存在)

  • 目前想到的办法 :
    • 若数据库写入成功,上传失败,则在上传失败位置再将数据库中的记录删除(反之亦然)
  • 但是考虑到这种情况写起来比较麻烦,所以想请求各位大哥指教下有没有什么更加巧妙的方法来处理这种情况
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 9
draven

上传失败了直接回滚不可以吗?

3年前 评论
qingshui (楼主) 3年前

先写入数据库,上传oss丢进列队执行,失败再删除记录或者设置已失败,成功修改记录为已上传,事务不合适,上传时间太久!

3年前 评论
qingshui (楼主) 3年前

我觉得思路应该是在选择添加电视剧的时候,给数据库添加集数,比如50集,这里就插入50行数据,然后每上传成功一集更新这行的状态,设置为已上传,而不是还要去删除数据库记录

3年前 评论
qingshui (楼主) 3年前

上传成功再写入数据库,理论上可能失败,但是实际上写入失败的概率比较低,除非你上传完之后数据库刚好挂掉,我建议你用这种方式先跑看看,等出现失败的情况在处理,不要顾虑太多

3年前 评论
qingshui (楼主) 3年前

首先,这里的oss上传需要搞成前端上传(否则会超级占用服务器带宽),上传成功之后,再让前端把上传成功的文件路径给到服务器保存就好啦。

3年前 评论
qingshui (楼主) 3年前
哓东 3年前
qingshui (楼主) 3年前
jenkincei

曾经写过oss上传,oss上传成功有个回调,是写入数据库的最佳时机。

3年前 评论
qingshui (楼主) 3年前

oss 上传视频必须前端上传,否则会占用大量带宽 以及内存。这是我这边走过的坑, oss 那边有前端上传的demo 。稍微改改就能用了 。千万千万千万 不要用后端上传!!!至于上传成功失败的问题,你可以做一个上传成功之后 再调用接口,把用户信息带过去。 这样就ok了 。但是还有个问题 。就是上传成功不一定会转码成功。 还需要你写个队列调用oss 接口检测下 是否转码成功。转码成功之后 才是真正的完成上传了

3年前 评论

@laaa 加上一句。如果你领导 非要你后端上传 。那你直接给他说上线出问题 让他负责

3年前 评论
qingshui (楼主) 3年前
laaa (作者) 3年前
qingshui (楼主) 3年前

参照 MySQL 的两阶段提交思路(即 binlog 和 redolog 都写入成功才提交事务)

具体到你这里就是:oss 上传和数据库插入都成功才执行事务。这只是一个思路,具体你怎么确定两个都成功,则需要你自己去处理细节(如 oss 上传时间与数据库连接超时等问题)

3年前 评论
qingshui (楼主) 3年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!