#sqlite #.net-core
#sqlite #.net-core
Вопрос:
Я хочу разделить соединение SQLite между потоками.
Если я введу следующее в оболочке SQLite:
sqlite>начать; вставить в значения Person(‘Tweety’,’Bird’,80); выберите last_insert_rowid(); зафиксировать;
Оболочка печатает новый идентификатор строки.
В консольном приложении dotnet core с использованием Microsoft.Data.SQLite
SqliteCommand command = new SqliteCommand("begin; insert into Person values('Tweety','Bird',81); select last_insert_rowid(); commit;", connection);
Консоль.Строка записи (команда.ExecuteScalar());
Я надеялся, что консоль напечатает новый rowid, но ExecuteScalar() возвращает null . Я подтвердил, что новая строка вставлена.
- Возможно ли получить новый идентификатор строки с помощью одной комбинированной команды?
- Является ли это атомарной транзакцией, если я разделяю соединение по нескольким потокам?
Комментарии:
1. Вы можете выполнить «select last_insert_rowid()» в отдельной команде (соединение должно оставаться открытым).
2. Но может ли другой поток, совместно использующий соединение, тем временем вставить новую строку?
3. Обычной практикой является использование отдельного подключения к БД для каждого потока; эффективность использования остается хорошей из-за пула соединений. Во время одного сеанса соединения (между открытием и закрытием) «last_insert_rowid()» возвращает идентификатор последней вставки, выполненной в этом сеансе.
4. Спасибо. Я процитирую ваш комментарий в качестве ответа.
Ответ №1:
Я процитирую комментарий Виталия Федорченко:
Обычной практикой является использование отдельного подключения к БД для каждого потока; эффективность использования остается хорошей из-за пула соединений. Во время одного сеанса соединения (между открытием и закрытием) «last_insert_rowid()» возвращает идентификатор последней вставки, выполненной в этом сеансе.