我想将文件存储在 Azure Blob 存储中。到目前为止,一切都很好。我还想存储有关文件的附加元数据;为此,我使用了 Azure SQL 数据库(因此我可以轻松地查询 blob 存储上的文件)。
因此,当我向商店添加新文件时,我想确保 blob 以及元数据已成功写入。因此,我想到了使用诸如事务上下文之类的东西。
有什么方法可以使用 blob 存储和 sql 存储来创建这样的事务上下文?
我想将文件存储在 Azure Blob 存储中。到目前为止,一切都很好。我还想存储有关文件的附加元数据;为此,我使用了 Azure SQL 数据库(因此我可以轻松地查询 blob 存储上的文件)。
因此,当我向商店添加新文件时,我想确保 blob 以及元数据已成功写入。因此,我想到了使用诸如事务上下文之类的东西。
有什么方法可以使用 blob 存储和 sql 存储来创建这样的事务上下文?
据我所知,没有任何内置功能可以做到这一点;您需要自己管理。最简单的方案是先保存 Blob,然后添加数据库记录。由于数据库用作满足您需求的索引,因此在保存数据库记录之前,Blob 对您的代码基本上是不可见的。
一个更复杂的选项是实现您自己的提交逻辑。您将处理数据库插入(例如,记录上的标志设置为 0),保存 Blob,如果成功,则将数据库中的标志设置为 1。
您也可以将元数据保存在 Azure Tables 中,但如果您有大量记录,在 Azure Tables 中搜索可能会显着减慢速度。大多数情况下,在 SQL 数据库中搜索会更快。
您选择哪种方法取决于您的目标,但我认为第一个选项是最简单的。
现有的 blob 是无害的,但指向不存在的 blob 的数据库记录会很糟糕。因此,我将使用以下逻辑实现事务。
在创建时...首先添加 blob,然后创建数据库记录。如果 blob 上传失败,则返回。如果 blob 上传成功,但数据库记录失败,则删除 blob 并返回。关键是在成功上传 Blob 之前,您不希望创建数据库记录。如果无法更新数据库记录,您还需要清理 blob。如果 blob 清理失败,我只需要一个定期运行的服务来清理一个多小时前创建的未引用 blob ,这样它就不会尝试在上传和创建数据库记录之间删除一个。
删除时... 首先删除数据库记录。如果失败,只需返回,blob 和数据库记录都仍然存在。如果数据库记录被删除,那么 blob 不会因为保留在那里而造成任何伤害,因此您可以尝试立即删除它,也可以将其留给清理服务稍后处理。