请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

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

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

正在回答 回答被采纳积分+3

1回答

xiaomo 2019-03-26 20:38:40

同学提的问题真好,目前的代码里的确是没有处理这种异常情况,我想到两种解决方法:

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 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号