Ich verwende SQLite last_insert_rowid()
, um die zuletzt eingefügte Zeilen-ID nach einer Batch-Einfügung zu greifen. Besteht die Gefahr von Race Conditions, die dazu führen könnten, dass dieser Wert nicht die letzte ID des Batch-Einsatzes zurückgibt? Ist es beispielsweise möglich, dass zwischen dem Abschluss der Einfügung und dem Aufruf von last_insert_rowid()
ein anderer Prozess wieder in die Tabelle geschrieben wurde?Abrufen von IDs von im Stapel eingefügten Zeilen in SQLite
Antwort
last_insert_rowid()
gibt Informationen über die letzte Einfügung in dieser spezifischen Verbindung zurück; Es kann keinen Wert zurückgeben, der von einem anderen Prozess geschrieben wurde.
Um sicherzustellen, dass der zurückgegebene Wert dem aktuellen Status der Datenbank entspricht, nutzen Sie die ACID Garantien (hier: Atomizität) von SQLite: Umbrechen Sie die Stapeleinfügungen, den last_insert_rowid()
Aufruf und was auch immer Sie mit der ID tun eine einzelne Transaktion.
In jedem Fall ändert sich der Rückgabewert von last_insert_rowid()
nur, wenn einige Einfügevorgänge über diese Verbindung ausgeführt werden. Daher sollten Sie niemals auf dieselbe Verbindung aus mehreren Threads zugreifen, oder wenn Sie dies wirklich tun möchten, ganze Transaktionen serialisieren.
last_insert_rowid()
ist verbindungsabhängig, daher besteht ein Risiko, wenn mehrere Threads die gleiche Verbindung verwenden, ohne dass SQLite in den serialisierten Threading-Modus gewechselt hat.
Wie schützt der serialisierte Thread-Modus vor diesem Problem? Verhindert es, dass mehrere Threads dieselbe Verbindung verwenden? – maxedison
Nichts hindert Sie daran, mehrere Threads zu verwenden, aber SQLite befindet sich standardmäßig im Serialisierungsmodus. Es soll SQLite threadsafe sogar innerhalb der gleichen Datenbankverbindung über Mutexe machen. – Zso
Ihre ursprüngliche Frage bezieht sich auf ** Prozesse **, aber Sie scheinen stattdessen an ** Threads ** interessiert zu sein. (Datenbankverbindungen können nicht zwischen Prozessen geteilt werden.) – Zso
- 1. Alle Zeilen von SQLite abrufen
- 2. Ändern der Hintergrundfarbe von Zeilen im Stapel
- 3. IDs von eingefügten Raws über Doktrin dbal
- 4. Index von eingefügten Zeilen aus einer MySQL-Datenbank abrufen
- 5. Wie alle zuletzt eingefügten Zeilen IDs in mysql-php abgerufen werden?
- 6. Abrufen von Zeilen aus einer Spalte in sqlite
- 7. Abrufen von Array von IDs in Mongoid
- 8. Mehrere neue Zeilen im Stapel?
- 9. Abrufen von Tabellenspaltennamen in SQLite
- 10. Daten aus sqlite Abrufen von in android
- 11. Abrufen von Zeilen in DB2
- 12. Alle Zeilen abrufen SQLite Android Studio
- 13. Abrufen von Zeiger auf Objekt vom Stapel
- 14. Abrufen von Daten von SQLite auf Android
- 15. Ersetzen Wert von Parameter im Stapel
- 16. Erfassen von eingefügten Textwerten aus mehreren Zeilen in einem Bericht
- 17. Abrufen von Benutzer von Sqlite ist null
- 18. Daten von SQLite in Teilen abrufen
- 19. Einfügen und Abrufen von Daten in SQLite
- 20. Liste der eingefügten ID in SQL Server
- 21. Abrufen von SQLITE Python mit Kivy
- 22. Abrufen von Story-IDs aus VersionOne
- 23. Wie Datagridview-Zeilen von SQLite-Datenbank
- 24. Verschieben von Zeilen in SQLite-Datenbank
- 25. Aktualisieren von Zeilen in Android SQlite
- 26. Wählen Sie zufällige Zeilen von doppelten IDS
- 27. Abrufen mehrerer Zeilen mit unterschiedlichen ids in mysql
- 28. Abrufen bestimmter Spalten von SQLite-Datenbank
- 29. Sqlite sortierte Zeilen innerhalb der Gruppe von
- 30. SQLite - Abrufen der Anzahl der Zeilen in einer Datenbank
Was ist mit @ Zso's Kommentar? Er schlägt ein Szenario vor, in dem mehrere Threads dieselbe Verbindung verwenden könnten. Würde eine Transaktion davor schützen? – maxedison
Eine Verbindung = eine Transaktion, daher sollten Sie niemals auf dieselbe Verbindung von mehreren Threads zugreifen, unabhängig vom Threading-Modus. –
Diese Antwort sollte nicht die akzeptierte sein, da sie über ** Prozesse ** spricht, aber das Risiko besteht in der Verwendung von ** Threads **. 'last_insert_rowid()' ist nicht notwendigerweise Multithread-sicher; Der Multi-Thread-Threading-Modus deaktiviert das Mutexing für Datenbankverbindungen. – Zso