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