采纳答案成功!
向帮助你的同学说点啥吧!感谢那些助人为乐的人
请问老师,调用完成分块合并接口时,先写入文件表,再写入用户文件表,这里面没有事务,要是写入文件表成功,写入用户文件表失败,这时怎么回滚文件表数据呢?
同学提的问题真好,目前的代码里的确是没有处理这种异常情况,我想到两种解决方法:
1) 使用sql事务机制,比如我们可以这样优化(两步sql合并到一个事务中执行):
// db, _ := sql.Open(...) tx, err := db.Begin() // 创建tx对象,事务开始 tx.Exec("写文件表sql") tx.Exec("写用户文件表sql") err := tx.Commit() // 事务提交,要么都成功,要么都失败 if err != nil { // commit失败, 事务回滚 tx.Rollback() }
2) 根据当前业务场景,文件信息写到文件表的时候这个文件其实已经是完成上传了,所以不回滚这个操作也是能讲得通的,只是当前这个用户得到的响应是合并失败而已;
我们可以加个提示客户端稍后重试的机制,只要是能够计算文件hash的客户端都可以触发秒传接口:也就是重试时可跳过实际上传文件传输和写文件表的步骤,只要写用户文件表就行。
登录后可查看更多问答,登录/注册
紧随“云时代”技术潮流,分布式云存储系统,做第一代云程序员
1.7k 23
2.4k 13
2.0k 13
1.5k 13
购课补贴联系客服咨询优惠详情
慕课网APP您的移动学习伙伴
扫描二维码关注慕课网微信公众号