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

来源: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的客户端都可以触发秒传接口:也就是重试时可跳过实际上传文件传输和写文件表的步骤,只要写用户文件表就行。

1
0

Go实战仿百度云盘-实现企业级分布式云存储系统

紧随“云时代”技术潮流,分布式云存储系统,做第一代云程序员

1077 学习 · 494 问题

查看课程