2012-03-29 5 views
0

1回のトランザクションにつき一連のレコード(たとえば100)を追加します。私は各レコードに「トランザクションID」フィールドを持たせ、新しいトランザクションごとにインクリメントし、特定のトランザクション内に挿入されたレコードごとに同じ値にします。クライアントがクエリを実行し、その後、同じクエリを実行することができますが、新しいトランザクションIDを持つレコードのみを取得できるようにします。それをする最善の方法は何ですか? DBはいくつかのプロセスからアクセスされるため、アプリケーションレベルでIDを生成する必要はありません。そのため、ID割り当てのクロスプロセスを調整する必要があります。または、私は単一のautoincrememt列を持つ専用のTXIDテーブルを作成し、トランザクションを開始する前にそれを挿入し、TXIDとしてlast_insert_rowid()を使用することができますが、IDを生成するだけのインクリメントのテーブルを格納するのは少し非効率です。何かご意見は?ありがとう。sqlite:マルチインサートトランザクションのトランザクションIDを作成する

答えて

1

整数を増分したい場合は、実際に提案したことを実行する必要があります。トランザクションIDを保持している別のテーブルが必要です。行を削除するには、この表を公平に掃引することができますが、行が非常に小さく効率的になるため、大きな問題ではありません。

他にもさまざまな解決策がありますが、既に理解しているように、ほとんどの場合、状況に応じて動作しません(必要な忠実度に応じて衝突する可能性があります)。一意性を保証するためにデータベースを活用する必要がある場合は、これがSQLiteで行う唯一の方法です。あるいは、randomまたはrandomblobfunctionsのようなものを試すこともできますが、PRGには一意性保証はありません。

あなたはあなたは多くのプロセスからの書き込みしている場合にも、これらはしかし、まれまだ競合、することができます(アプリケーションレベルでRFC 4122 UUIDを生成することができ、単調に増加する整数を必要としない場合 - あなたはまた、タグ付けする場合がありますプロセス固有の文字列を使用して、urn:uuid:<tag>+<uuid>のようなURNにします)。すべてのライターが同じマシン上にある場合、タグとしてpidのようなものを使用すれば、一意性を保証するのに十分です。

+0

お返事ありがとうございます。私はUUIDについて考えましたが、新しいIDのそれぞれが最後のIDよりも大きくなるようにする必要があります。 TXIDテーブルソリューションを行います。 – gimmeamilk

関連する問題