2014-05-20 19 views
2

我們在這裏關於異常處理,事務和SQL錯誤的辦公室有一些爭論。是否最好在ASP.NET或SQL Server中處理事務和錯誤?

我們有很多存儲過程,它們都是從樣板代碼創建的,所以每個存儲過程都有一個Try ... Catch塊。如果@@ NESTLEVEL = 1,許多(儘管不是全部)創建自己的事務。

一個參數是處理事務和ASP.NET級別的任何錯誤,從存儲過程中刪除所有try/catch,像這樣:

Dim sConnectionString As String = "<some connection string>" 
    Using oConn As New SqlClient.SqlConnection(sConnectionString) 
     Dim oCmd As New SqlClient.SqlCommand("StoredProcWithNoTransaction", oConn) 
     Dim oTrans As SqlClient.SqlTransaction 

     oCmd.CommandType = CommandType.StoredProcedure 

     oTrans = oConn.BeginTransaction 
     Try 
      oConn.Open() 

      oCmd.ExecuteNonQuery() 

      oTrans.Commit() 
     Catch ex As SqlClient.SqlException 
      oTrans.Rollback() 
      If ex.Number = 1205 Then 

      ElseIf ex.Number = 50001 Then 

      ElseIf ex.Number = 50002 Then 

      End If 
     Catch ex As Exception 
      oTrans.Rollback() 

     End Try 
    End Using 

另一種是讓存儲過程處理錯誤和交易 CREATE MyProc的 @iSomeID INT AS

TRY 
    BEGIN TRANSACTION 

    --<UPDATE, DELETE, do stuff> 

    COMMIT TRANSACTION 
END TRY 
BEGIN CATCH 
    DECLARE @ERROR_MESSAGE NVARCHAR(2048), 

    @ERROR_PROCEDURE NVARCHAR(126), 
    @ERROR_NUMBER INTEGER, 
    @ERROR_LINE  INTEGER, 
    @ERROR_SEVERITY INTEGER, 
    @ERROR_STATE  INTEGER, 
    @TRAN_STATE  INTEGER, 
    @TRAN_COUNT  INTEGER 

    SET @TRAN_STATE  = XACT_STATE(); 
    SET @TRAN_COUNT  = @@TRANCOUNT; 
    SET @ERROR_MESSAGE = ERROR_MESSAGE() 
    SET @ERROR_PROCEDURE = ERROR_PROCEDURE() 
    SET @ERROR_NUMBER = ERROR_NUMBER() 
    SET @ERROR_LINE  = ERROR_LINE() 
    SET @ERROR_SEVERITY = ERROR_SEVERITY() 
    SET @ERROR_STATE  = ERROR_STATE() 

    IF @TRAN_STATE <> 0 AND @TRAN_COUNT <> 0 ROLLBACK TRANSACTION 

    IF @ERROR_NUMBER = 1205 
     BEGIN 
      PRINT('Something') 
     END 
    ELSE IF @ERROR_NUMBER = 50001 
     BEGIN 
      SELECT This FROM here WHERE there=1 
     END 
    ELSE IF @ERROR_NUMBER = 50001 
     BEGIN 
      SELECT This FROM here WHERE there=1 
     END 

    RAISERROR (@ERROR_NUMBER,@ERROR_SEVERITY,@ERROR_STATE) 

END CATCH 

這裏的問題是:這是正確的方式?在頁面級捕獲錯誤或死鎖會造成性能問題?

我見過很多關於在兩種情況下如何處理交易錯誤的文章,但是最好的處理方式是什麼?

+0

就像我的意見暗示的一樣:你喜歡* T-SQL作爲一種編程語言嗎?你想要更多的T-SQL或更多的C#? (恐怕問題要麼廣泛,要麼基於觀點)。 – usr

回答

-1

去維護時容易的一個。我認爲以這種方式編寫每一個sp都會讓其他人更容易理解,而處理服務器端是最好的選擇。所以對我來說,選擇一個就是要走的路。