PHP在代码中怎么保证原子性
- 业务场景 : 同时上传多集电视剧到oss,并把每集剧的信息保存到数据库中
- 问题描述 : 由于网络的不稳定性,可能存在数据库写入成功,上传oss失败的情况(上传成功,数据库写入失败也存在)
- 目前想到的办法 :
- 若数据库写入成功,上传失败,则在上传失败位置再将数据库中的记录删除(反之亦然)
- 但是考虑到这种情况写起来比较麻烦,所以想请求各位大哥指教下有没有什么更加巧妙的方法来处理这种情况
关于 LearnKu
上传失败了直接回滚不可以吗?
先写入数据库,上传oss丢进列队执行,失败再删除记录或者设置已失败,成功修改记录为已上传,事务不合适,上传时间太久!
我觉得思路应该是在选择添加电视剧的时候,给数据库添加集数,比如50集,这里就插入50行数据,然后每上传成功一集更新这行的状态,设置为已上传,而不是还要去删除数据库记录
上传成功再写入数据库,理论上可能失败,但是实际上写入失败的概率比较低,除非你上传完之后数据库刚好挂掉,我建议你用这种方式先跑看看,等出现失败的情况在处理,不要顾虑太多
首先,这里的oss上传需要搞成前端上传(否则会超级占用服务器带宽),上传成功之后,再让前端把上传成功的文件路径给到服务器保存就好啦。
曾经写过oss上传,oss上传成功有个回调,是写入数据库的最佳时机。
oss 上传视频必须前端上传,否则会占用大量带宽 以及内存。这是我这边走过的坑, oss 那边有前端上传的demo 。稍微改改就能用了 。千万千万千万 不要用后端上传!!!至于上传成功失败的问题,你可以做一个上传成功之后 再调用接口,把用户信息带过去。 这样就ok了 。但是还有个问题 。就是上传成功不一定会转码成功。 还需要你写个队列调用oss 接口检测下 是否转码成功。转码成功之后 才是真正的完成上传了
@laaa 加上一句。如果你领导 非要你后端上传 。那你直接给他说上线出问题 让他负责
参照 MySQL 的两阶段提交思路(即 binlog 和 redolog 都写入成功才提交事务)
具体到你这里就是:oss 上传和数据库插入都成功才执行事务。这只是一个思路,具体你怎么确定两个都成功,则需要你自己去处理细节(如 oss 上传时间与数据库连接超时等问题)