Участвует ли класс System.Diagnostics.EventLog в транзакциях при вызове метода WriteEntry? - PullRequest
0 голосов
/ 09 августа 2010

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

[Редактировать: Для пояснения - это работает на Server 2008 R2, .Net 3.5]

[Редактировать: добавлен пример - в основном отвечает на вопрос, но если кто-то может ссылаться на документацию]

EventLog.WriteEntry("Start.");

using(TransactionScope scope = new TransactionScope()) {

EventLog.WriteEntry("Middle.");

throw new applicationexception("Whatever");

scope.Complete();

}

EventLog.WriteEntry("End.");

Мой журнал событий показывает только начало и конец.

1 Ответ

1 голос
/ 20 августа 2010

EventLog не поддерживает транзакции.Я не думаю, что есть какая-либо конкретная документация по этому вопросу.Это имеет смысл, поскольку в документации редко упоминаются вещи, которые не поддерживаются, если только нет явной причины для этого (пояснения, распространенное заблуждение и т. Д.).

С практической точки зренияпростой тест показывает, что сообщения регистрируются, даже если транзакция откатывается:

class Program
{
    static void Main(string[] args)
    {
        EventLog.WriteEntry("Application", "Start");

        using (var scope = new TransactionScope(TransactionScopeOption.RequiresNew))
        {
            EventLog.WriteEntry("Application", "123");
        }

        EventLog.WriteEntry("Application", "End");
    }
}

В средстве просмотра событий я вижу 3 события («Начало», «123», «Конец»).

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

...