Как создать класс, который работает с TransactionScope? - PullRequest
28 голосов
/ 10 марта 2011

Просто интересно, если я хочу создать класс, который что-то делает, и я хочу, чтобы его можно было использовать в TransactionScope, что мне нужно реализовать?

То есть: мой класс должен знать, что он находится в транзакции, но как он будет получать уведомления о коммите или откате? И что касается Откат, как бы я на самом деле Откат?

Я предполагаю, что мой класс будет иметь такие методы, как «Добавить», «Обновить» и «Удалить», которые изменяют только временный список изменений, и метод «Чтение», который должен определить, находится ли он в транзакции, и вернуть измененный или неизмененные данные соответственно, но тогда мне нужен метод Commit / Rollback, который вызывается как-то?

Буду ли я подписываться на событие Transaction.TransactionCompleted? Если да, как мне избежать нескольких подписок на одну и ту же транзакцию?

Я заметил, что Транзакции не имеют идентификаторов, есть ли способ управлять / манипулировать несколькими параллельными транзакциями или вложенными транзакциями?

Документация MSDN для System.Transactions содержит много контента, но, похоже, она предназначена для потребителей, а не для разработчиков, поэтому мне интересно, есть ли у кого-нибудь хороший источник (либо в Интернете, либо в книга) о том, как служба будет оказывать поддержку для транзакций?

Давайте предположим, что у моего класса нет базового хранилища, которое уже поддерживает транзакции и способно просто "пропустить его". Давайте предположим, что мой класс выглядит так:

public class MyClass {
    private List<MyObject> _businessData;

    public void Create(Myobject data) { ... }
    public MyObject Read(string query) { ... }
    public void Update(Myobject data) { ... }
    public void Delete(Myobject data) { ... }
}

1 Ответ

17 голосов
/ 11 марта 2011

В этой статье есть хороший обзор того, что требуется. Он старше, но я верю, что все это применимо.

Чтобы подвести итог статьи, вам нужно вызвать один из Enlist методов класса Transaction , передав реализацию IEnlistmentNotification.

.
...