如果在错误发生之前,查询是否在失败的try语句中运行

本文关键字:失败 try 运行 是否 语句 错误 如果 查询 | 更新日期: 2023-09-27 17:50:58

假设我有以下示例(伪代码示例)

try{
     INSERT SQL to DB 1
     INSERT SQL to DB 2
     --FAILURE OCCURS HERE FOR SOME REASON AND IT GOES TO CATCH STATEMENT
     INSERT SQL to DB 3
 }catch(err){
     ERROR MESSAGE  
 }

前两个查询是否会在DB上运行,因为它们在错误之前?

程序是否知道有错误而不运行try语句中的代码块并直接跳转到catch块?

如果在错误发生之前,查询是否在失败的try语句中运行

您可以这样处理您在存储过程中描述的情况:

BEGIN TRANSACTION;
BEGIN TRY   
   INSERT SQL to DB 1
   INSERT SQL to DB 2
   --FAILURE OCCURS HERE FOR SOME REASON AND IT GOES TO CATCH STATEMENT
   INSERT SQL to DB 3
END TRY
BEGIN CATCH         
   IF (@@TRANCOUNT > 0) 
      ROLLBACK TRANSACTION;            
   -- Return 0 value to indicate failure of execution
   RETURN 0                             
END CATCH;
-- If transaction is still active then commit it
IF (@@TRANCOUNT > 0) 
   COMMIT TRANSACTION;
-- Return 1 value to indicate successful execution of INSERT statements
RETURN 1

如果TRY块中任何 INSERT语句失败,则所有这些语句都将回滚。否则,所有的INSERT查询都提交给数据库。

您可以在c#中实现类似的逻辑,但通常最好将整个实现封装在存储过程中。

编程语言(DB适配器/接口)中有许多方法可以在DB级别处理事务。如果这三个查询没有封装在一些代码中,这些代码本质上是打开事务并在使用提交的第三条语句后结束事务,那么上述两个查询将已经在DB上运行并单独提交。从你的代码来看,没有事务打开/提交/回滚行围绕着3个语句,这意味着上面两个语句已经提交到数据库,因为DB认为它们每个单独的事务。然而,如果你将这3条语句包装在一个事务打开/提交块中,然后如果任何一条语句失败,已经执行的查询将被回滚,因为代码的catch块会让DB引擎知道事务是打开的,没有提交,但是发生了异常,因此回滚先前执行的语句。