在一次交易中上传 blob 并获取租约

Upload blob and acquire lease in one transaction

是否可以上传到 blob 存储并在同一事务中获取该 blob 的租约。这是为了避免潜在的竞争条件。

以下代码执行上述操作,但作为两个不同的事务:

blob.UploadText(String.Empty);
blob.AcquireLease(TimeSpan.FromSeconds(60), leaseId);

如果另一个 thread/process/instance 必须在上述两个事务之间获取该 blob 的租约,则会抛出 StorageException(HTTP 代码 412)。

这可以通过捕获此类异常来缓解,如下所示,但是如果无法在一个事务中执行上传和租用获取,我们无法保证上传后该线程将租用 blob。

blob.UploadText(String.Empty);

try
{
    blob.AcquireLease(TimeSpan.FromSeconds(60), leaseId);
}
catch (StorageException ex)
{
    if (ex.RequestInformation.HttpStatusCode != 412)
    {
        throw;
    }
}

AFAIK,今天不可能仅在一次交易中上传和获取租约。

看看你上面的代码,你不能把 blob.UploadText 放在同一个 try/catch 块中吗?如果第一个线程已获得租约,则第二个线程的上传操作将失败。此外,由于这些操作是顺序发生的,而不是并行发生的,因此上传 blob 的线程很可能会获得租约。不过,您需要尝试一下。