请问老师,调用完成分块合并接口时,先写入文件表,再写入用户文件表,这里面没有事务,要是写入文件表成功,写入用户文件表失败,这时怎么回滚文件表数据呢?
来源:6-5 编码实战:实现分块合并接口

linxiyun
2019-03-26
请问老师,调用完成分块合并接口时,先写入文件表,再写入用户文件表,这里面没有事务,要是写入文件表成功,写入用户文件表失败,这时怎么回滚文件表数据呢?
写回答
1回答
-
xiaomo
2019-03-26
同学提的问题真好,目前的代码里的确是没有处理这种异常情况,我想到两种解决方法:
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的客户端都可以触发秒传接口:也就是重试时可跳过实际上传文件传输和写文件表的步骤,只要写用户文件表就行。
10
相似问题