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

Я делаю вызовы в транзакции, и когда выдается исключение (что предотвращает мой 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 ответ

Решение

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,

Другие вопросы по тегам