1

我正在使用 T/SQL 存储过程来确保如果数据进入数据库,则数据具有完整性。我使用存储过程的样板代码将存储过程包装在事务中。

CREATE PROCEDURE sp<SprocName,,> 
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;

DECLARE @tranIsLocal bit, @errNo int

IF @@TRANCOUNT =0
BEGIN
    BEGIN TRANSACTION tr_sp<SprocName,,> 
    SET @tranIsLocal = 1
END

/* Do Stuff Here 

 update table1
      ...

 if @@Error<>0
 Begin
      set @errNo=1
      goto ErrorHandler
 end


select Results ...
 if @@Error<>0
 Begin
      set @errNo=1
      goto ErrorHandler
 end

if @tranIsLocal <>0
begin
    COMMIT TRANSACTION   tr_sp<SprocName,,> 
end 
return 0
ErrorHandler:
if @tranIsLocal <>0
begin 
        rollback transaction  tr_sp<SprocName,,> 
end
    return @errNo
END
GO

我知道使用 Try Catch 可能会更好,但除非它确实有助于解决手头的问题,否则我不想解决这个问题。

特别是我需要更新两个表,我想确定一个表不能更新,而另一个不能。

我正在使用 LinqToClasses,因为我(从我的前任)继承的代码就是这样做的,毫无疑问,将类准备好编码而不是手动编码数据层接口会更快。

我假设 ExecuteMethodCall 将对数据库的调用包装在事务本身中。

所以由于存储过程在创建事务之前会检查是否有事务,并在调用回滚事务之前测试该事务是否由存储过程创建。

问题是如果我必须做些什么来确保事务将在.net 失败时回滚。

ExecuteMethodCall 会检查返回值并回滚事务吗?

如果不是,我可以检查返回值以及从 DataClassesDataContext 中带回结果集吗?

我可以通过在存储过程中调用 RAISEERROR 或 THROW 来使 ExecuteMethodCall 回滚事务吗?

理想情况下,是否有任何文档可以阐明 Microsoft 如何在 .net 方面处理与 ExecuteMethodCall 相关的事务?

4

0 回答 0