假设我有以下示例(伪代码示例)
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语句中运行代码块并将strait跳转到catch块?
答案 0 :(得分:2)
这是您处理存储过程中描述的情况的方法:
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
如果INSERT
块中的任何 TRY
语句失败,则会回滚这些语句的所有。否则,所有INSERT
查询都将提交给数据库。
您可以在C#中实现类似的逻辑,但通常最好将整个实现包装在存储过程中。
答案 1 :(得分:0)
编程语言(数据库适配器/接口)有多种方法可以处理数据库级别的事务。如果这三个查询没有包含一些基本上打开事务的代码并在使用提交的第三个语句之后结束它,那么上面的两个查询就已经在DB上运行并单独提交。 从您的代码判断,3个语句周围没有事务打开/提交/回滚行,这意味着上述两个语句已经提交到数据库,因为数据库将它们视为各个事务。 但是,如果将这3个语句包装在事务打开/提交块周围,然后如果任何一个语句失败,则已经执行的查询将被回滚,因为代码的catch块将让数据库引擎知道事务已打开且未提交但是发生异常因此回滚先前执行的语句。