0

私のアプリケーションでは、1回のボタンクリックで複数のデータベーストランザクションを実行する必要があるフォームがありました。つまり、ボタンをクリックしたとき

クエリ 1 >>>指定テーブルに指定値を挿入

クエリ 2. >>クエリを選択して、最後に入力された指定の主キーを取得します。つまり、上記の挿入クエリが挿入する自動番号です。

クエリ 3 >> 上記の主キー recvd を使用してデータを別のテーブルに挿入します

クエリ 4 .>> 上記の主キーで別のテーブルを更新する

クエリのいずれかが失敗するか、例外が発生した場合、他のクエリは機能しません

今、例外が発生した場合はtry catchを使用して以前の挿入を削除しようとしています...

私はSQL Server 2008が初めてなので、良いアイデアはありますか

4

1 に答える 1

1

他の人がコメントしているように、これらすべての操作を、それぞれに個別のトランザクションを使用するのではなく、単一のトランザクションにラップします。トランザクションのACIDプロパティの「原子性」の部分により、すべての操作が成功するか、まったく成功しないかが保証され、部分的な結果が得られることはありません。

ADO.NET を使用している場合は、そのためにBeginTransactionCommitを使用します。

ところで、ステップ 2 は実行しないでください。ステップ 1 の後、ステップ 2 を実行する前に、並行クライアントが行を挿入 (およびコミット) した場合はどうなるでしょうか? 間違った PK を取得します。手順 1 で生成された PKを直接取得することをお勧めします。

于 2012-09-10T11:50:56.480 に答える