Azure Blob存储的事务访问

时间:2012-10-10 11:44:42

标签: azure-sql-database azure-storage-blobs

我想将文件存储在Azure Blob存储中。到现在为止还挺好。我还想存储关于该文件的附加元数据;为此,我使用Azure SQL数据库(因此我可以轻松查询blob存储上的文件)。

因此,当我向商店添加新文件时,我想确保blob以及元数据已成功编写。因此,我想到了使用像交易环境这样的东西。

有没有办法,使用blob存储和sql存储来创建这样的事务上下文?

2 个答案:

答案 0 :(得分:6)

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

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

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

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

答案 1 :(得分:2)

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

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

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