Участвует ли класс 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
,