2015-08-04 4 views
3

Я пытаюсь использовать DocumentDb запись в качестве части сделки, как показано ниже -DocumentDb написать в TransactionScope

using (var scope = new TransactionScope) 
{ 
//first transaction 

//write to document db 

//third transaction 
} 

Я заметил, что если третья сделка не удается, documentDb запись не откатывается, и я до сих пор см. документ в коллекции. Первая транзакция (NEventStore в этом случае) отлично отходит назад. Кто-нибудь знает, поддерживает ли DocumentDb TrnasactionScope. Что делать, если у меня есть вложенная транзакция?

Спасибо!

Редактировать: Похоже, что TransactionScope не поддерживается DocumentDb, и он ничего не знает о них. Есть ли способ сделать транзакции DocumentDb частью внешней транзакции с C#? Кто-нибудь сталкивался с этим прецедентом раньше?

Edit 2: Последующий вопрос и ответ here как предложено

+0

Даже с вашим отредактированным вопросом ответ остается таким же, как и то, что я опубликовал: внешних механизмов транзакций нет, только транзакция с sproc-областью. Примечание. Не очень хорошая форма изменить контекст вашего вопроса после получения ответа на ваш вопрос. Лучше задать новый вопрос. –

+0

Несомненно. Я открою новый вопрос для изучения этого контекста. – Abhishek

ответ

5

операции DocumentDB независимы от TransactionScope. Как только операция вернется, все будет сделано. Служба базы данных ничего не знает о TransactionScope и никак не связана с ней.

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

+0

Спасибо! есть ли способ решить эту проблему? – Abhishek

+2

Единственный способ - использовать Хранимые процедуры DocumentDB, как предлагает @David. –

+0

Таким образом, моя область транзакций не ограничена documentDb, но есть внешние элементы (строка NEventStore), которые являются частью этой транзакции. – Abhishek

0

Многие пользователи SQL не понимают, что делать, если транзакции недоступны.

Вы должны реализовать логику компенсации самостоятельно или использовать фреймворки, такие как Windows Workflow Foundation. Логика компенсации связана с шаблонами интеграции предприятия. Вы также можете использовать шаблон ID корреляции, чтобы проверить, была ли выполнена большая операция.

SQL люди управляют большими операциями таким же образом, когда необходимо совершить длительную транзакцию. https://www.amazon.com/Enterprise-Integration-Patterns-Designing-Deploying/dp/0321200683/ref=sr_1_1?ie=UTF8&qid=1480917322&sr=8-1&keywords=integration+patterns

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