6

私のSQLiteベースのアプリケーションは現在、ロールバックを可能にするためとパフォーマンスを向上させるための両方でトランザクションを使用しています。すべてのトランザクションをセーブポイントに置き換えることを検討しています。その理由は、アプリケーションがマルチスレッドであり(はい、sqliteスレッドセーフになるように構成されている)、場合によっては、トランザクションが2つのスレッドによって同時に(同じデータベース上で)開始される可能性があるためです。

  1. それをしない理由はありますか?
  2. 知っておく必要のある落とし穴はありますか?
  3. BEGIN、、をCOMMIT、、に置き換えるだけですか?ROLLBACKSAVEPOINT xyzRELEASE SAVEPOINT xyzROLLBACK TO SAVEPOINT xyz
4

1 に答える 1

7
    It there a reason NOT to do it?

はい。それはあなたが概説した問題のどれも解決しません。セーブポイントは、主にデータの部分的なロールバックを実行できるようにするために使用されます。外部トランザクションまたはセーブポイントは、実際にコミットされるものです。その最も外側のセーブポイントが解放されてDBが更新されるまで、実際には何も完全に保存されません。標準のトランザクションで発生するのと同じ問題にすぐに戻ります。

    Are there any pitfalls I need to be aware of?

はい。マルチスレッドアプリケーションのトランザクションまたはセーブポイントは、2つの異なるスレッドで同じデータを更新する場合、かなり簡単にデッドロックする可能性があります。これが問題の核心であると思います。この点で2つの間に違いはありません。各スレッドで何を更新しているかを認識し、それに応じて同期する必要があります。

つまり、部分的なトランザクションロールバックを実行する必要がない限り、セーブポイントは実際には多くを提供しません(名前が付けられているという事実を除いて)。

ここには特効薬はありません。アプリケーションと、複数のスレッドで更新される可能性のあるデータを真剣に分析し、必要に応じてアプリケーションに同期を追加する必要があるようです。

于 2012-03-12T22:12:58.943 に答える