Ignore TransactionScope for specific query

后端 未结 3 1646
星月不相逢
星月不相逢 2020-12-13 19:12

I\'m looking for a way to execute a query while a TransactionScope is alive, and ignore the TransactionScope - basically, I want to execute this particular query no matter w

相关标签:
3条回答
  • 2020-12-13 19:18

    Just my initial thought, but you need to put your LogRepo on it's own DataContext (DC2) so that the surrounding TransactionScope (with DC1) won't roll it back when it's not committed.

    Basically, you need to make your logging self-contained and atomic.

    EDIT In looking at it some more, it seems to me that if you moved your Logging out from the SaveChanges into the catch() on DoSomething(), your logging would work. But, your logging still needs to be self-contained and atomic.

    0 讨论(0)
  • 2020-12-13 19:28

    If you wrap your log call inside of another transaction scope with the suppress option enabled, transaction scope will not be used.

    public override int SaveChanges() {
        try {
            return base.SaveChanges();
        } catch (Exception ex) {
            using (var scope = new TransactionScope(TransactionScopeOption.Suppress)) {
                LogRepo.Log(message); // stuff to log from the context
            }
    
            throw;
        }
    }
    
    0 讨论(0)
  • 2020-12-13 19:28

    I found one solution that I'm not really happy with, but seems to work. TransactionScope apparently only affects the current thread, so logging using a new thread seems to work ok.

    public override int SaveChanges() {
        try {
            return base.SaveChanges();
        } catch (Exception ex) {
    
            string message = /*stuff to log from the context*/;
            new Thread(msg => {    
    
                LogRepo.Log(msg);
    
            }).Start(message);
    
            throw;
        }
    }
    
    0 讨论(0)
提交回复
热议问题