我正在使用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方面的事务?