Что делать, если ни TransactionScope, ни вложенные транзакции не поддерживаются? - PullRequest
0 голосов
/ 04 октября 2010

TransactionScope - удивительная функция, но слишком мало поставщиков реализуют ее правильно. Я не хочу передавать соединение в качестве параметра.

Ответы [ 2 ]

1 голос
/ 04 октября 2010

Не уверен, что вы хотели достичь с помощью TransactionScope здесь - если идея заключается в том, чтобы иметь автоматический поток транзакций по методам (и простое включение в текущую транзакцию), то передача соединения в качестве параметра - не единственный способ. Вы можете передать текущее соединение и транзакцию, используя текущий CallContext (или Текущий поток). Поместите простую статическую оболочку, которая проверяет, существует ли соединение / транзакция в текущем контексте вызова, и создает, если нет. Это прозрачный ненавязчивый способ, в отличие от передачи по параметру.

Теперь, если вы просматриваете текущие транзакции через границы домена приложения и / или используете несколько менеджеров ресурсов (то есть, используете распределенные транзакции), то лучшим вариантом будет использование TransactionScope и развертывание вашего собственного ResourceManager, Конечно, это не тривиальная вещь, но это то, что влечет за собой это требование. Если базовая система не предоставляет транзакционный ресурс, тогда пользовательский менеджер ресурсов может использовать компенсационную транзакцию для выполнения отката (например, менеджер в верхней части файловой системы может использовать «Удалить папку» в качестве компенсационной транзакции для исходной транзакции «Создать папку») .

0 голосов
/ 04 октября 2010

Может быть, вы ищете Системная распространенность .

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

Ниже приведена ссылка на шаблон Снимок , который может помочь вам в реализации Превалирования системы.

...