2

родимые,LightSwitch: Распределенные транзакции на Azure

У меня есть сценарий, где я должен выполнять обновления на внутренней базе данных LightSwitch и вызвать некоторые SQL хранимых процедур в экономии трубопровода все в одной операции, например, что если ошибка произошел в конвейере LS save, тогда мои вызовы хранимой процедуры откатываются назад.

Рекомендуемый способ сделать это: создать внешнюю транзакцию в событии SaveChanges_Executing и избавиться от нее в событиях SaveChanges_Executed и SaveChanges_ExecuteFailed. Как описано в этих статьях http://www.codemag.com/Article/1103071

Но это имеет две фатальных проблем:

  1. Это не работает, когда я публикую приложение на Azure, так как распределенные транзакции не поддерживаются там.
  2. Также он выдает сообщение об ошибке при попытке сохранить изменения в источниках ApplicationData с использованием ServerApplicationContext. Ошибка заключается в следующем: Исходный провайдер не выполнил транзакции в EnlistTransaction

Кто-нибудь нашел более чистый способ обработки транзакций в LightSwitch, который работает как на Azure, так и через ServerApplicationContext ??

Большое спасибо

ответ

2

В настоящее время, распределенные транзакции с использованием MSDTC не работают против SQL Azure. Однако они отлично справятся с SQL Server в VM, работающей в Azure. Как правило, MSDTC привязан к работе на контроллере домена, и это не имеет смысла в контексте общего облака. Вероятно, необходим альтернативный DTC, но это не то, о чем публично объявили сегодня.

Я не думаю, что Lightswitch является основной проблемой здесь (хотя, возможно, у него есть дополнительная проблема, кроме того, что я описал).

Я надеюсь, что, по крайней мере, объясняет, почему сегодня это не работает - я бы хотел, чтобы у меня был лучший ответ для вас, но сейчас это невозможно. Используемые «обходные пути» - это создание приложений, которые могут быть устойчивыми к фиксации, происходящим с каждой стороны (или нет) и восстанавливаться после неудачных случаев.