如果在错误发生之前,查询是否在失败的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块?
您可以这样处理您在存储过程中描述的情况:
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引擎知道事务是打开的,没有提交,但是发生了异常,因此回滚先前执行的语句。