gpt4 book ai didi

c# - 我们还需要在 C# 代码和存储过程中应用 Sql Transaction 吗?

转载 作者:太空狗 更新时间:2023-10-29 23:07:16 25 4
gpt4 key购买 nike

我有一个存储过程正在更新 SQL Server 中的多个表。此过程正在 C# 代码中使用。

如果我仅在 C# 代码中应用事务,这是否是一种好的做法?

是否需要在 C# 代码和存储过程中应用事务?

谢谢

最佳答案

如果进程仅在单个 SqlCommand 中调用单个存储过程,然后只需在存储过程中处理事务,无需从 C# 代码管理它。您只需要在 C# 代码中管理它,以便跨多个 SqlCommand 维护事务。处决。

仅供引用,只有在满足以下两个条件时才需要在两个层中管理事务:

  • C# 代码生成多个 SqlCommand需要被视为单个操作的调用
  • 存储过程可以/将被此 C# 代码外部调用,例如其他存储过程(在这种情况下,存储过程可能不存在现有事务)打电话。

在上述场景之外,在两个层中管理事务是没有意义的,因为只有一个事务。如果事务是在 C# 代码中启动的,那么在 BEGIN TRAN 时存储过程中发生的所有事情。被称为@@TRANCOUNT递增。直到 @@TRANCOUNT 交易才真正提交。通过发出相同数量的 COMMIT 返回到 0如@@TRANCOUNT所示(在这种情况下,在存储过程中发出 COMMIT 并在 C# 代码中再次发出,此时 SQL Server 实际上执行真正的“提交”)。但是,单个 ROLLBACK带来@@TRANCOUNT回到 0,不管它是什么数字。如果存储过程中发生这种情况,则您不能发出 COMMITROLLBACK在 C# 代码中,因为事务不再存在,因此您需要先测试事件事务。

假设您至少使用 SQL Server 2005,如果不是更新的版本,请务必使用 T-SQL TRY / CATCH管理 COMMIT / ROLLBACK 的语法在存储过程中。 即使您仅在 C# 代码中管理事务,您也需要 TRY/CATCH 语法来正确捕获错误并退出过程。

例如:

BEGIN TRY

BEGIN TRAN;

UPDATE Table1 ... ;

UPDATE Table2 ... ;

UPDATE Table3 ... ;

COMMIT TRAN;

END TRY
BEGIN CATCH

IF (@@TRANCOUNT > 0)
BEGIN
ROLLBACK TRAN;
END;

THROW; -- if using SQL Server 2012 or newer, else use RAISERROR

END CATCH;

关于c# - 我们还需要在 C# 代码和存储过程中应用 Sql Transaction 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25820102/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com