TSQL / .net事务处理LinqToClasses DataClassesDataContext

时间:2013-02-07 17:02:43

标签: .net tsql linq-to-sql transactions

我正在使用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如何处理有关ExecuteMethodCall的.net方面的事务?

0 个答案:

没有答案