11

我想将文件存储在 Azure Blob 存储中。到目前为止,一切都很好。我还想存储有关文件的附加元数据;为此,我使用了 Azure SQL 数据库(因此我可以轻松地查询 blob 存储上的文件)。

因此,当我向商店添加新文件时,我想确保 blob 以及元数据已成功写入。因此,我想到了使用诸如事务上下文之类的东西。

有什么方法可以使用 blob 存储和 sql 存储来创建这样的事务上下文?

4

2 回答 2

8

据我所知,没有任何内置功能可以做到这一点;您需要自己管理。最简单的方案是先保存 Blob,然后添加数据库记录。由于数据库用作满足您需求的索引,因此在保存数据库记录之前,Blob 对您的代码基本上是不可见的。

一个更复杂的选项是实现您自己的提交逻辑。您将处理数据库插入(例如,记录上的标志设置为 0),保存 Blob,如果成功,则将数据库中的标志设置为 1。

您也可以将元数据保存在 Azure Tables 中,但如果您有大量记录,在 Azure Tables 中搜索可能会显着减慢速度。大多数情况下,在 SQL 数据库中搜索会更快。

您选择哪种方法取决于您的目标,但我认为第一个选项是最简单的。

于 2012-10-10T13:46:31.803 回答
5

现有的 blob 是无害的,但指向不存在的 blob 的数据库记录会很糟糕。因此,我将使用以下逻辑实现事务。

在创建时...首先添加 blob,然后创建数据库记录。如果 blob 上传失败,则返回。如果 blob 上传成功,但数据库记录失败,则删除 blob 并返回。关键是在成功上传 Blob 之前,您不希望创建数据库记录。如果无法更新数据库记录,您还需要清理 blob。如果 blob 清理失败,我只需要一个定期运行的服务来清理一个多小时前创建的未引用 blob ,这样它就不会尝试在上传和创建数据库记录之间删除一个。

删除时... 首先删除数据库记录。如果失败,只需返回,blob 和数据库记录都仍然存在。如果数据库记录被删除,那么 blob 不会因为保留在那里而造成任何伤害,因此您可以尝试立即删除它,也可以将其留给清理服务稍后处理。

于 2016-10-28T18:58:56.860 回答