SQL事务+Try-catch还是VB.NET事务+Try-catch?

3

我正在处理一个连接到数据库的应用程序。如果某些数据库操作失败,我肯定要进行回滚操作。我只是在想,使用SQL还是VB.NET中的事务+try-catch更好呢?

在VB.NET中可这样做:

Try

...

Catch ex As Exception
    MyTransaction.Rollback
End Try

如果在 SQL 中使用 try catch:

...
MyCommand.CommandText = _
"USE AdventureWorks2008R2; " & _
"GO " & _
"BEGIN TRANSACTION; " & _
"BEGIN TRY " & _
"    ... " & _
"END TRY " & _
"BEGIN CATCH " & _
"    SELECT  " & _
"        ERROR_NUMBER() AS ErrorNumber " & _
"        ,ERROR_SEVERITY() AS ErrorSeverity " & _
"        ,ERROR_STATE() AS ErrorState " & _
"        ,ERROR_PROCEDURE() AS ErrorProcedure " & _
"        ,ERROR_LINE() AS ErrorLine " & _
"        ,ERROR_MESSAGE() AS ErrorMessage; " & _
"    IF @@TRANCOUNT > 0 " & _
"        ROLLBACK TRANSACTION; " & _
"END CATCH; " & _
"IF @@TRANCOUNT > 0 " & _
"    COMMIT TRANSACTION; " & _
"GO " & _
MyCommand.ExecuteNonQuery()

我通常使用VB.NET来实现这个功能,但是其他方法有什么区别?它们之间存在什么不同?是否存在任何缺点?

2个回答

2

其中一个区别是捕获的错误。

  • SQL catch会捕获在SQL查询中发生的错误
  • VB.Net catch会捕获在VB.Net中发生的错误,包括通过.Net API传播的编程和许多查询错误

你需要使用哪一个取决于你的情况。如果VB.Net try块所做的只是执行查询并在出现错误时回滚,则最好在SQL中进行回滚。这将使数据库逻辑紧密而局部化。

但是,如果VB.Net try块包括其他业务逻辑,则将回滚保留在那里可能更有意义。


0
从功能上讲,它们是一样的 - vb.net 版本会被翻译并作为 SQL 查询运行。
主要区别在于,您可以使用同一连接执行多个 SQL 语句,而无需生成一个包含事务中所有所需内容的大型 SQL 查询。

VB.NET版本被翻译并作为SQL查询运行。事务可以,但是try...catch不行。如果它是LINQ查询的一部分或Expression的一部分,那么这只有可能发生在第一次。 - stakx - no longer contributing

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接