执行后能够恢复(将文件更新到 Blob 存储)和(通过 EF Core 添加/更新数据库)

Posted

技术标签:

【中文标题】执行后能够恢复(将文件更新到 Blob 存储)和(通过 EF Core 添加/更新数据库)【英文标题】:Ability to revert (update file to blob storage) and (db add/update via EF Core) after execution 【发布时间】:2021-10-05 09:17:38 【问题描述】:

我的计划是同时发生 2 个动作。如果 1 失败则恢复,但我很难找到它的方法。

操作 1,上传/更新文件到 blob 存储(通过命名空间 Azure.Storage.Blobs > public class BlobContainerClient

操作 2,在 db 上添加/更新记录/行(通过 EF Core)

伪代码是

public async Task<ActionResult> Upload(<parameter-lists>)

  // authentication
  // verify file (name, size, ...)

  // PORTION THAT I HAVE DIFFICULTY
  // trying to do [database save] and [upload to storage blob] at the same time
  // if success, then good. return response
  // if [at least 1] fail, then REVERT both processes ([database save] and [upload to storage blob])

我愿意接受任何建议。

如果他们一个接一个地运行,而我们仍然有能力恢复第一个动作,那也很棒!

============

编辑1,朋友有这个建议。

这似乎是个好主意,但我很好奇 如果这个方法有效 如果我们可以使用事务回滚或者我们必须手动编码来恢复这两个函数await RollbackBlobStorageAsync();await RollbackDatabaseAsync();
try 

  await Task.WhenAll(
    UpdateDatabaseAsync(),
    UpdateBlobStorageAsync(),
  );
 
catch (DbUpdateException)

  await RollbackBlobStorageAsync();

catch (BlobStorageUpdateException)

  await RollbackDatabaseAsync();

============

我愿意接受任何建议。

如果他们一个接一个地运行,而我们仍然有能力恢复第一个动作,那也很棒!

【问题讨论】:

【参考方案1】:

其实你可以使用事务。 最好阅读文档documentation

谈到你的建议,请记住数据库上下文不是thread safe.

var tasks = Task.WhenAll(
    UpdateDatabaseAsync(),
    UpdateBlobStorageAsync(),
  );

try
    await tasks;

catch(exception ex)
    foreach (var inx in tasks.Exception.InnerExceptions)
    
        log(inx);
    


if(tasks.IsFaulted)
   await RollbackBlobStorageAsync();
   await RollbackDatabaseAsync();

【讨论】:

感谢回复,但我认为它不起作用。我之前研究过 Transaction/Savepoints,但有 2 个限制 1-它只处理 [通过 EF Core 更新 db],它不能处理 [blob storage update] 2-回滚必须在同一个函数中完成,因为我们没有那种 luruxy(ef core dbcontext 在 Repository 文件中,而 blobContainerClientWrapper 在另一个文件中) 嗯,我明白了。在这种情况下,您可能不会得到这些异常,因为它可能是另一个线程。 DbUpdateException、BlobStorageUpdateException。你应该这样做 var task = Task.WhenAll() try await task catch(exception) if(task.IsFaulted) await rollbackAsync();等待回滚BlobAsync())

以上是关于执行后能够恢复(将文件更新到 Blob 存储)和(通过 EF Core 添加/更新数据库)的主要内容,如果未能解决你的问题,请参考以下文章

将文件上传到 Azure Blob 存储导致大小为 0

使用 Visual Basic 将 BLOB(图像)文件存储到 MS Access

Azure Blob 容器备份和恢复

将 Azure BLOB 存储同步到 Amazon S3

将映像上载到存储后的firebase更新数据库

将文件从 SFTP 复制到 Blob 存储时并行执行 Azure 逻辑应用