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側でトランザクションを処理する方法を明確にするドキュメントはありますか?