Microsoft.Data.SQLite (.net core) получает атомарный last_insert_rowid

#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. Возможно ли получить новый идентификатор строки с помощью одной комбинированной команды?
  2. Является ли это атомарной транзакцией, если я разделяю соединение по нескольким потокам?

Комментарии:

1. Вы можете выполнить «select last_insert_rowid()» в отдельной команде (соединение должно оставаться открытым).

2. Но может ли другой поток, совместно использующий соединение, тем временем вставить новую строку?

3. Обычной практикой является использование отдельного подключения к БД для каждого потока; эффективность использования остается хорошей из-за пула соединений. Во время одного сеанса соединения (между открытием и закрытием) «last_insert_rowid()» возвращает идентификатор последней вставки, выполненной в этом сеансе.

4. Спасибо. Я процитирую ваш комментарий в качестве ответа.

Ответ №1:

Я процитирую комментарий Виталия Федорченко:

Обычной практикой является использование отдельного подключения к БД для каждого потока; эффективность использования остается хорошей из-за пула соединений. Во время одного сеанса соединения (между открытием и закрытием) «last_insert_rowid()» возвращает идентификатор последней вставки, выполненной в этом сеансе.