2014-02-28 85 views
1

我嘗試用我的程序執行以下操作。 創建一個新的事務範圍,執行插入命令來執行日誌記錄,執行不同的命令來執行更新,然後故意引發異常。事務處理數據庫日誌記錄失敗

正如我所期望的更新命令回滾,但我如何提交插入命令?看起來插入命令也回滾了,但我想提交日誌記錄。

我不使用,也不想MSDTC。

class Program 
{ 
    private static string connectString1 = "myconnstring"; 
    static void Main(string[] args) 
    { 

     try 
     { 
      var opt = new TransactionOptions 
      { 
       IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted, 
       Timeout = TransactionManager.MaximumTimeout 
      }; 

      using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, opt)) 
      { 
       using (SqlConnection conn = new SqlConnection(connectString1)) 
       { 
        conn.Open(); 

        Logging(conn); 

        SqlCommand command1 = new SqlCommand("update Company set City='BP' where Id = 2", conn); 
        int aff = command1.ExecuteNonQuery(); 
        throw null; 
       } 
       scope.Complete(); 
      } 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine("Message: {0}", ex.Message); 
     } 
    } 

    public static void Logging(SqlConnection conn) 
    { 
     var opt = new TransactionOptions 
     { 
      IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted, 
      Timeout = TransactionManager.MaximumTimeout 
     }; 
     using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Suppress, opt)) 
     { 
      SqlCommand command2 = new SqlCommand("insert into ErrorLog(AppURL,Title,Message) values ('a','b','c')", conn); 
      int aff2 = command2.ExecuteNonQuery(); 
      scope.Complete(); 
     } 
    } 
} 
+1

使用不同的事務記錄? – nos

+0

無論我的事務是否回滾,我都想始終保持日誌記錄插入。這是一個簡化的例子,在生產代碼中,主要事務處理作用域中有幾種方法,都包含日誌記錄。 –

回答

0

看來,如果我沒有在現有的連接通過,但我創建的壓制範圍則日誌插入將被保留,即使外部事務回滾一個新的....

public static void Logging() 
    { 
     var opt = new TransactionOptions 
     { 
      IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted, 
      Timeout = TransactionManager.MaximumTimeout 
     }; 
     using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Suppress, opt)) 
     { 
      using (SqlConnection conn2 = new SqlConnection(connectString1)) 
      { 
       conn2.Open(); 
       SqlCommand command2 = new SqlCommand("insert into ErrorLog(AppURL,Title,Message) values ('a','b','c')", conn2); 
       int aff2 = command2.ExecuteNonQuery(); 
       scope.Complete(); 
      } 
     } 
    }