Мне нужна помощь в отношении транзакций из Linq в sql. Ниже представлен типичный макет транзакции. Если какая-либо операция не удалась, все операции откатываются.
mainTransaction (tScope)
Operation 1 changes
db.submitChanges()
Operation 2 changes
db.submitChanges()
...
catch(TransactionException ex)
'rollback mainTransaction
tScope.complete()
Однако я хотел бы иметь сценарий, в котором операция 2 должна иметь возможность видеть изменения от операции 1, и если какая-либо из операций завершится неудачно, все предыдущие операции должны быть отменены.
Я мог бы подумать о вложенных транзакциях в Linq to Sql, но, возможно, есть лучший способ. Я еще не пробовал подход вложенных транзакций.
mainTransaction
childTransaction #1
child 1 changes
childTransaction #2 changes
should see child 1 changes
child 2 changes
childTransaction #3 changes
should see child 1 changes
should see child 2 changes
child #3 changes
catch(TransactionException ex)
'rollback child 1
'rollback child 2
...
tScope.complete()
Обновление: допустим, у нас есть родительские и дочерние отношения. Родитель будет иметь ссылку на дочернюю коллекцию как parent.Childs EntitySet. Во всех операциях я передаю родительскую ссылку и выбираю дочерний EntitySet как parent.Childs. Я добавляю дочерние записи в таблицу Childs Linq, а не в Childs EntitySet. После операции №1 я выполняю db.submitChanges (). Для операции № 2 я не вижу вставленных записей операции № 1 в parent.Childs EntitySet даже после db.SubmitChanges (), но я вижу в таблице Child Linq. Есть идеи?
Я хочу сделать это с помощью Linq to Object. Linq to Object, похоже, не «видит» записи InsertOnSubmit в последующих операциях (например: если я вставляю запись в дочернюю таблицу, EntitySet, возвращенный из родительского отношения, не отображает вставленную запись).
Мне удалось добиться этого в Linq to SQL, но за счет повторного запроса всей таблицы Linq. Мне пришлось бы писать повторяющийся код для каждой операции.
Любые идеи? Пожалуйста, дайте мне знать, если вы придумаете более простой способ. Спасибо.