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
這裏的問題是:這是正確的方式?在頁面級捕獲錯誤或死鎖會造成性能問題?
我見過很多關於在兩種情況下如何處理交易錯誤的文章,但是最好的處理方式是什麼?
就像我的意見暗示的一樣:你喜歡* T-SQL作爲一種編程語言嗎?你想要更多的T-SQL或更多的C#? (恐怕問題要麼廣泛,要麼基於觀點)。 – usr