0

我正在使用在可序列化事务中调用 SQL 存储过程的 C# 类。

因此,如果存储过程出现问题,一切都会回滚。

我在 SQL 存储过程中有一条语句应该始终执行(即使存储过程在某些时候失败并且发生回滚)。该语句是对记录的更新。

我无法更改 C# 库,因此我需要在我的存储过程中执行此操作。

有什么方法可以在事务之外执行那个语句吗?

4

3 回答 3

1

您也许可以使用SAVE TRANSACTION。它在分布式事务中不受支持,并且您的语句必须先执行,因此它可能不是您要查找的内容。

于 2013-06-26T20:39:02.753 回答
0

我找到了解决方案。我没有意识到 SQL 知道它是由 c# 类在事务性事务中调用的。

应该始终执行的更新语句是该过程的第一步(也是最后一步)。让我澄清一下:我有一个 IF 函数。如果是真的,那么无论如何都应该进行更新。如果为假,则应执行一些事务逻辑。现在在 c# 类中,它期望来自存储过程的结果。如果 proc 没有返回结果(就像在 update 语句中那样),它会回滚事务。

因此,只需在更新语句之后添加以下行,就会发生更新:)

IF @@TRANCOUNT > 0
    BEGIN
        COMMIT TRANSACTION
    END
于 2013-06-26T21:07:35.503 回答
0

您的解决方案听起来不是一个好的解决方案。例如,如果您的存储过程将成为更大事务的一部分,那么它将提交之前所做的所有更改。另外我相信没有人会在没有第一次看到代码的情况下猜到你的 proc 有这样的行为。

需要始终执行 proc 的某些部分听起来像是需要安全审计。所以也许你应该改用跟踪、扩展事件或 sql server 审计。

如果你真的需要你所说的,你可以使用这里描述的方法:如何在 SQL Server 2008 中创建一个自治事务

于 2013-06-27T08:26:14.057 回答