在一次交易中上传 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 的线程很可能会获得租约。不过,您需要尝试一下。
是否可以上传到 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 的线程很可能会获得租约。不过,您需要尝试一下。