C# 如果查询在错误发生之前运行,是否会在失败的try语句中运行?
假设我有以下示例(伪代码示例) 前两个查询是否会在数据库上运行,因为它们在错误发生之前 或C# 如果查询在错误发生之前运行,是否会在失败的try语句中运行?,c#,sql,.net,sql-server,C#,Sql,.net,Sql Server,假设我有以下示例(伪代码示例) 前两个查询是否会在数据库上运行,因为它们在错误发生之前 或 程序会知道有错误而不运行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
程序会知道有错误而不运行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级别处理事务。如果这三个查询没有围绕一些代码进行包装,而这些代码本质上打开了一个事务,并在使用commit的第三个语句之后结束它,那么上述两个查询将已经在DB上运行并分别提交。 从代码判断,这3条语句周围没有事务打开/提交/回滚行,这意味着上述两条语句已经提交到数据库,因为DB将它们视为单独的事务。
但是,如果将这3条语句包装在事务打开/提交块周围,然后如果任何一条语句失败,已经执行的查询将回滚,因为代码的catch块将让DB引擎知道事务已打开且未提交,但发生异常,因此回滚以前执行的语句 如果您在代码周围放置一个事务,那么当出现错误时,您可以回滚所有内容。是的,它们将被执行。你需要交易来处理这种情况。好的,谢谢。我明白你的意思:)
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