私のコードからストアドプロシージャを呼び出しています。ストアドプロシージャを呼び出す前に、私は接続が開いているかどうかを確認しています。そうでない場合は、接続を開きます。トランザクションの名前を付けるときに@@計数が必要ですか?
ストアドプロシージャは、次の体を持っています
begin try
begin tran mytran;
--do inserts here into my table
commit tran mytran;
--return id''s of inserted records
select id from mytable;
end try
begin catch
rollback tran mytran;
throw;
end catch;
トランザクションを明示的に、ストアドプロシージャで開始されました。上記は正しいですか私が使用する必要があります。
begin catch
if @@trancount > 0
rollback tran mytran;
throw;
end catch;
第二に、最終select id from mytable;
場所が正しいか、それはend catch
ブロックの下に移動する必要がありますか?
あなたがイスラエルの墓地に戻ってくるのを手に入れたいなら、それを「エンドキャッチ」の下に置く。なぜなら、インサートやその他の何かが失敗したとしても、あなたは引き続きIDの背中を得るからです。私はあなたがこれをどのように扱うかを知らない。しかし、失敗があった場合、それを見るのは難しいです。あなたがあなたのブロックの終わりにそれを置くと失敗すると、あなたは "間違った" IDを取得しません。あなたの2番目の質問:TRY ... CATCHコンストラクトは、データベース接続を閉じない重大度が10以上のすべての実行エラーをキャッチします。だから私はあなたのように2回私を救い、 'if @@ trancount> 0'をインスタントロールバックの代わりに配置します。 – Cataklysim