Транзакционный доступ к хранилищу BLOB-объектов Azure

Я хочу хранить файлы в хранилище BLOB-объектов Azure. Все идет нормально. Я также хотел бы сохранить дополнительные метаданные о файле; для этого я использую базу данных SQL Azure (поэтому я могу легко запрашивать файлы в хранилище BLOB-объектов).

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

Есть ли способ создать такой контекст транзакции, используя хранилище BLOB-объектов, а также хранилище sql?


person nyn3x    schedule 10.10.2012    source источник


Ответы (2)


Насколько я знаю, нет ничего встроенного, что могло бы сделать это; вам нужно будет управлять этим самостоятельно. Самый простой сценарий - сначала сохранить большой двоичный объект, а затем добавить запись в базу данных. Поскольку база данных служит индексом для ваших нужд, Blob по существу невидим для вашего кода до тех пор, пока записи базы данных не будут сохранены.

Более сложный вариант - реализовать собственную логику фиксации. Вы должны обработать вставку базы данных (например, с флагом записи, установленным на 0), сохранить Blob и в случае успеха установить флаг в базе данных на 1.

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

Какой подход вы выберете, зависит от ваших целей, но я думаю, что первый вариант самый простой.

person Herve Roggero    schedule 10.10.2012

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

При создании ... сначала добавьте большой двоичный объект, а затем создайте запись в базе данных. Если загрузка большого двоичного объекта не удалась, просто вернитесь. Если загрузка большого двоичного объекта прошла успешно, но запись в базе данных завершилась неудачно, удалите большой двоичный объект и вернитесь. Дело в том, что вы не захотите создавать запись в базе данных до ПОСЛЕ успешной загрузки большого двоичного объекта. Вы также хотите очистить большой двоичный объект, если запись базы данных не может быть обновлена. Если очистка больших двоичных объектов не удалась, у меня была бы просто служба, которая периодически запускается для очистки ненужных больших двоичных объектов, созданных более чем на час назад, чтобы она не пыталась удалить их между загрузкой и созданием базы данных. записывать.

При удалении ... Сначала удалите запись в базе данных. Если это не удается, просто вернитесь, и большой двоичный объект, и запись базы данных все еще там. Если запись базы данных удаляется нормально, большой двоичный объект не причиняет вреда, оставаясь там, поэтому вы можете либо попытаться удалить его немедленно, либо оставить его для службы очистки, чтобы позаботиться о нем позже.

person Triynko    schedule 28.10.2016