2015-03-20 2 views
0

Можно ли загружать в хранилище blob и приобретать аренду на этом блоке в рамках одной транзакции. Это должно было бы избежать потенциального состояния гонки.Загрузить blob и приобрести арендную плату за одну транзакцию

Следующий код делает выше, но как два отдельных сделки:

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

Если другой поток/процесс/экземпляр должен был приобрести в лизинг на этом сгусток между двумя вышеуказанными сделками, то код StorageException (HTTP 412).

Это можно смягчить, если вы поймаете такие исключения, как показано ниже, но без возможности выполнить покупку и покупку в ходе одной транзакции мы не можем гарантировать, что blob будет арендован этим потоком после загрузки.

blob.UploadText(String.Empty); 

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

Можете ли вы описать свой сценарий более подробно, особенно «избегать потенциального состояния гонки»? –

+0

@GauravMantri: Я обновил свой вопрос. Дайте мне знать, если этого недостаточно. – davenewza

ответ

1

AFAIK, сегодня невозможно загрузить и приобрести лизинг всего за одну транзакцию.

Рассматривая свой код выше, не можете ли вы поместить blob.UploadText в тот же блок try/catch? Таким образом, операция загрузки по второму потоку завершится неудачно, если 1-й поток приобретет аренду. Кроме того, поскольку эти операции выполняются последовательно, а не параллельно, более чем вероятно, что поток, который загрузил blob, получит аренду. Однако вам нужно попробовать.

+0

Возможно, я был не совсем ясен. Другие потоки или процессы не загружают blob. Они только просят сдавать его в аренду, если он существует. Спасибо за Ваш ответ. – davenewza

+0

Итак, если я правильно понял, один процесс будет загружать blob, а затем есть отдельные процессы, ожидающие ожидания, и каждый может получить аренду. Вы хотите, чтобы только процесс, который загружает blob, приобретает аренду. Я прав? Возможно ли использование очередей? –

+0

Да, вы на месте. Я бы предпочел не использовать очереди, но я понимаю, что другого варианта нет. – davenewza

Смежные вопросы