SQLiteのlast_insert_rowid()
を使用して、バッチ挿入後に最後に挿入された行IDを取得しています。この値がバッチインサートの最後のIDを返さない原因となる競合状態のリスクはありますか?たとえば、挿入の完了とlast_insert_rowid()
の呼び出しの間に、別のプロセスが再度テーブルに書き込まれている可能性がありますか?SQLiteで一括挿入された行のIDを取得する
0
A
答えて
1
last_insert_rowid()
この特定の接続で行われた最後の挿入に関する情報を返します。他のプロセスによって書き込まれた値を返すことはできません。
(ここでは:アトミック):SQLiteののACID保証を活用し、返される値は、データベースの現在の状態に対応することを保証するために、バッチ挿入をラップlast_insert_rowid()
コール、そして何でもあなたが内部のIDでやっています単一のトランザクション。
いずれの場合でも、戻り値last_insert_rowid()
はこの接続によって何らかの挿入が行われた場合にのみ変更されるため、複数のスレッドから同じ接続にアクセスすることは絶対に避けてください。
1
last_insert_rowid()
は接続依存であるため、複数のスレッドが同じ接続を使用しているときにSQLiteをシリアル化スレッドモードに切り替える必要はありません。
関連する問題
- 1. codeigniterに一括挿入のIDを取得する方法は?
- 2. SQLiteとCoreDataの一括挿入
- 3. 挿入後に挿入されたレコードのIDを取得
- 4. 挿入された行のIDを取得
- 5. 挿入された行のIDを取得
- 6. 一括挿入に行が挿入されない
- 7. WP8/C#/ SQLite:最後に挿入されたIDを取得しますか?
- 8. テキストファイルに行を一括挿入する
- 9. 最後に挿入されたプリペアドステートメントのIDを取得する
- 10. Zendに最後に挿入されたIDを取得する
- 11. jruby jdbc挿入された行のIDを取得する方法
- 12. 複数の行に最後に挿入されたIDを取得する
- 13. trafodionの最後に挿入された行IDを取得する
- 14. Postgres 9.5に挿入された行のIDを取得する方法UPSERT
- 15. ファイアフォックスアドオンでSQLiteの最後に挿入されたID
- 16. SQLite iPhoneの最後の挿入IDを取得
- 17. 同じステートメントに挿入されたIDのIDを取得する
- 18. 最後に挿入されたIDを取得したい
- 19. Oracle OCIは最後に挿入された行のIDを取得します
- 20. 1つのクエリで一括挿入と更新sqlite
- 21. 特定の行のOpenrowset一括挿入
- 22. SQLiteDatabase、挿入された行のID
- 23. Psycopg2とGreenplumデータベースで最後に挿入された行IDを取得
- 24. 一括挿入クエリの後にテーブルから総挿入行数を取得する方法mysql
- 25. Hibernate一括挿入の実行方法
- 26. 一括挿入クエリ
- 27. 一括挿入、asp.net
- 28. TSQL - 一括挿入
- 29. 一括挿入は
- 30. 行を挿入しないで次のIDを取得する
@ Zsoさんのコメントはどうですか?彼は、複数のスレッドが同じ接続を使用しているシナリオを提案しています。トランザクションはこれに対してガードしますか? – maxedison
1つの接続= 1つのトランザクションなので、スレッドモードに関係なく、複数のスレッドから同じ接続にアクセスすべきではありません。 –
この回答は、**プロセス**について語っているので、受け入れられるべきではありませんが、リスクは**スレッド**を使用することです。 'last_insert_rowid()は必ずしもマルチスレッドセーフではありません。 「マルチスレッド」スレッドモードでは、データベース接続のミューテックスを無効にします。 – Zso