3

テーブルの 1 つの複数の行をアトミック操作として更新する必要があります。

更新は、特定の行の int 列のいくつかの値をインクリメントすることに関するものです。1 回のアクションで複数の行の値をインクリメントする必要があります。

これを行う最良の方法は何ですか?

この質問に答えるには、次の 2 つの質問に答える必要があります。

  • LINQ to SQL を使用する場合、インクリメント操作の原子性を実現するにはどうすればよいですか (トランザクションを使用しますか、それとももっと良い方法がありますか)。
  • ストアド プロシージャはアトミックに実行されますか (DB でプロシージャを呼び出す場合)。

私は SQL Server を使用して C# で作業しています。

4

2 に答える 2

0

SQL Server ではExplicit Transactions、ユーザーがキーワードを使用してトランザクションを明示的に開始し、すべての操作がエラーなしで完了したら、エラーが発生した場合にBEGIN TRANSACTIONキーワードを使用してトランザクションをコミットできます。COMMIT TRANSACTION例外として、進行中のトランザクションのどこでも、キーワードを使用して作業を元に戻すことができますROLLBACK TRANSACTION
Write Ahead 戦略
SQL サーバーはWrite Ahead Strategy、トランザクションの原子性とデータの耐久性を確認するために使用します。ステップ

  1. データ ページをバッファ キャッシュにロードします。
  2. バッファ内のコピーを更新します。
  3. ログ キャッシュにログ レコードを作成します。
  4. チェックポイント プロセスを介してログ レコードをディスクに保存します。
  5. データをディスクに保存します。

したがって、トランザクションを ROLLBACK することにした場合は、これらすべてのステップのプロセスのどこでも。ディスク上の実際のデータは変更されません。
私のおすすめ

BEGIN TRY

       BEGIN TRANSACTION 
        ------ Your Code Here ------


        ---- IF everything Goes fine (No errors/No Exceptions)

       COMMIT TRANSACTION

END TRY

BEGIN CATCH 

         ROLLBACK TRANSACTION   --< this will ROLLBACK any half done operations 


         -- Your Code here ---------

END CATCH
于 2013-11-07T13:37:37.247 に答える
-1

私の答えは次のとおりです。インクリメントは、LINQ to SQL を介して直接実現することはできません。ただし、ストアド プロシージャは LINQ から呼び出すことができ、インクリメントはそこで実現できます。

私の解決策は、トランザクション内の単一の while ループ内で必要な更新を実行するストアド プロシージャを作成することでした。このようにして、すべての更新が単一のアトミック操作として実行されます。

UPDATE ステートメントは、それ自体がアトミックです。

于 2013-11-12T19:50:13.270 に答える