Загрузка хранилища BLOB-объектов Azure внутри TransactionScope

Мне было интересно, есть ли способ или даже будет ли это работать: загрузите файл в хранилище больших двоичных объектов Azure внутри TransactionScope, и, если что-то пойдет не так, откатитесь, «удалив» файл.

Кто-нибудь пробовал или достиг такой цели?

Просто пример кода, который я пытаюсь выполнить:

using (var transaction = new TransactionScope(TransactionScopeOption.Required, new TransactionOptions() { IsolationLevel = System.Transactions.IsolationLevel.ReadUncommitted }))
{
  try {
    //some code before to get the file from its location....
    UploadFileToAzure(stream, filePath);
    transaction.Complete();
  }
  catch(Exception ex) 
  {
    //rollback the transaction and avoid uploading the file.
  }
}

person Bruno    schedule 10.03.2017    source источник
comment
Связано: stackoverflow.com/questions/18045517/   -  person Dan Field    schedule 10.03.2017
comment
Связано: stackoverflow.com/questions/12818546/   -  person Dan Field    schedule 10.03.2017
comment
@dan - ты должен был проголосовать за то, чтобы закрыть как дубликат. Не обязательно иметь один и тот же вопрос с одинаковыми ответами.   -  person David Makogon    schedule 10.03.2017
comment
Я вижу это сейчас - я думаю, при первом проходе этот по какой-то причине казался немного другим.   -  person Dan Field    schedule 10.03.2017


Ответы (2)


Хранилище BLOB-объектов не знает о транзакциях — это механизм хранения. Не могли бы вы записать на локальный диск в транзакции?

Блочные BLOB-объекты загружаются порциями. Каждому фрагменту присваивается идентификатор, когда он был успешно загружен, и любой фрагмент файла может быть загружен в любом порядке (он не обязательно должен быть последовательным).

На этом этапе большой двоичный объект все еще «незафиксирован» — и если на этом этапе загрузка не удалась, вы можете просто забыть о нем, и хранилище Azure очистит/удалит его через некоторое время. Как только все блоки будут загружены, вы можете зафиксировать большой двоичный объект, указав Azure, в каком порядке объединять блоки (это будет упорядоченный список идентификаторов блоков). После этого большой двоичный объект зафиксирован и должен быть удален вручную.

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

person caesay    schedule 10.03.2017
comment
Это было то, что я себе представлял!! Большое спасибо за разъяснение! - person Bruno; 10.03.2017

Да, вы можете это сделать, но TransactionScope не добавляет ничего особенного в отношении хранилища Azure. Вам придется удалить файл (если он даже загружен), используя соответствующие вызовы API/библиотеки. Если удаление не удалось, откат транзакции ничего не отменит в отношении большого двоичного объекта.

person Dan Field    schedule 10.03.2017