Как правильно исключить запись из TransactionScope в .Net - PullRequest
3 голосов
/ 27 апреля 2011

У меня есть такой код:

using (var scope = GetTransactionScope())
{
  ... do stuff
  InfoLogger.LogInformation("blah blah", "Blah blah", someEventId);
}

(Примечание: GetTransactionScope () возвращает мне транзакцию).

Но я не хочу вовлекать вызов регистрации в транзакцию; вызов LogInformation() переводит вызов в корпоративные библиотеки.

Насколько я понимаю, мне нужно использовать Suppress TransactionScopeOption , чтобы исключить вызов регистрации из транзакции (это единственный / лучший способ)?

Предполагая, что это так, я бы предпочел сделать это внутри моего помощника - иначе у меня будет большой внедорожник с дополнительным кодом TransactionScope повсюду ... Итак, это лучший способ / приемлемо:

public static void LogInformation(string title, string message, int eventId)
{
    using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Suppress))
    {
        ... do the real logging.
    }
}

1 Ответ

4 голосов
/ 27 апреля 2011

Да, использование опции Suppress будет означать, что «сделать реальное ведение журнала» происходит вне контекста транзакции.

Но это зависит немного от того, что вы регистрируете и почему;Еще один подход заключается в том, чтобы перебросить все ваши данные регистрации в очередь производителя / потребителя (то есть потокобезопасную очередь, обслуживаемую отдельным потоком).Поскольку TransactionScope привязан к потоку, это удаляет ассоциацию транзакций, но также имеет преимущество удаления ведения журнала в качестве фактора (задержки и т. Д.) В самой операции и позволяет группировать ведение журнала.операций, если вы выберете.

Очевидно, что это применимо только к информационному протоколированию, поскольку существует вероятность (в крайних случаях), что небольшое количество данных из очереди будет потеряно во время повторных циклови т. д.

Подход производителя / потребителя особенно заманчив, если вы регистрируетесь в файл, поскольку он позволяет синхронизировать доступ к файлу (что, очевидно, необходимо), без необходимостизаблокировать сам IO (вы только синхронизируете доступ к очереди).

...