2016-11-27 6 views
0

SQLiteのlast_insert_rowid()を使用して、バッチ挿入後に最後に挿入された行IDを取得しています。この値がバッチインサートの最後のIDを返さない原因となる競合状態のリスクはありますか?たとえば、挿入の完了とlast_insert_rowid()の呼び出しの間に、別のプロセスが再度テーブルに書き込まれている可能性がありますか?SQLiteで一括挿入された行のIDを取得する

答えて

1

last_insert_rowid()この特定の接続で行われた最後の挿入に関する情報を返します。他のプロセスによって書き込まれた値を返すことはできません。

(ここでは:アトミック):SQLiteののACID保証を活用し、返される値は、データベースの現在の状態に対応することを保証するために、バッチ挿入をラップlast_insert_rowid()コール、そして何でもあなたが内部のIDでやっています単一のトランザクション。

いずれの場合でも、戻り値last_insert_rowid()はこの接続によって何らかの挿入が行われた場合にのみ変更されるため、複数のスレッドから同じ接続にアクセスすることは絶対に避けてください。

+1

@ Zsoさんのコメントはどうですか?彼は、複数のスレッドが同じ接続を使用しているシナリオを提案しています。トランザクションはこれに対してガードしますか? – maxedison

+0

1つの接続= 1つのトランザクションなので、スレッドモードに関係なく、複数のスレッドから同じ接続にアクセスすべきではありません。 –

+0

この回答は、**プロセス**について語っているので、受け入れられるべきではありませんが、リスクは**スレッド**を使用することです。 'last_insert_rowid()は必ずしもマルチスレッドセーフではありません。 「マルチスレッド」スレッドモードでは、データベース接続のミューテックスを無効にします。 – Zso

1

last_insert_rowid()は接続依存であるため、複数のスレッドが同じ接続を使用しているときにSQLiteをシリアル化スレッドモードに切り替える必要はありません。

+1

シリアル化されたスレッドモードでこの問題がどのように防御されますか?複数のスレッドが同じ接続を使用しないようにしますか? – maxedison

+0

複数のスレッドを使用することはできませんが、SQLiteはデフォルトでシリアル化モードになっています。 mutexを介して同じデータベース接続内でもSQLiteのスレッドセーフを行うことになっています。 – Zso

+0

元の質問は**プロセス**を示していますが、スレッド**に興味があるようです。 (データベース接続はプロセス間で共有できません) – Zso

関連する問題