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

これはTryCatchを使用した方がよいと思いますが、実際に問題が解決しない限り、これに対処することはしたくありません。

特に、2つのテーブルを更新する必要があります。一方のテーブルを更新することはできず、もう一方のテーブルを更新することはできないことを確認したいと思います。

私がLinqToClassesを使用しているのは、(前任者から)継承したコードがこのように実行し、データレイヤーインターフェイスを手動でコーディングするよりも、クラスをすぐにコーディングできる方が間違いなく速いためです。

ExecuteMethodCallは、データベースへの呼び出しをトランザクション自体にラップすると想定しています。

したがって、ストアドプロシージャは、トランザクションを作成する前にトランザクションがあるかどうかを確認し、ロールバックトランザクションを呼び出す前に、トランザクションがストアドプロシージャによって作成されたかどうかをテストするためです。

問題は、.netによる失敗時にトランザクションがロールバックされることを保証するために、何かしなければならないことです。

ExecuteMethodCallは戻り値をチェックし、トランザクションをロールバックしますか?

そうでない場合は、戻り値を確認して、DataClassesDataContextから結果セットを返すこともできますか?

ストアドプロシージャでRAISEERRORまたはTHROWを呼び出して、ExecuteMethodCallにトランザクションをロールバックさせることはできますか?

理想的には、MicrosoftがExecuteMethodCallに関して.net側でトランザクションを処理する方法を明確にするドキュメントはありますか?

4

0 に答える 0