LINUX.ORG.RU

Как sqlite работает с параллельными транзакциями через QSql?

 ,


1

3

Представим ситуацию: приложение послало запрос-транзакцию на запись, после чего началось выполнение. В это время, пока не закончилась первая транзакция, на выполнение приходит вторая из параллельного потока. Что будет? Вернется ошибка блокировки или вторая транзакция будет ожидать первую и потом выполнится? Подскажите пожалуйста, не хочется проводить эксперимент, а гугл пока ответа не дал.

★★★★

Последнее исправление: Silerus (всего исправлений: 1)

Насколько я знаю, sqlite вообще однопоточный. Его нужно пересобрать с доп. плагом, чтобы сделать многопточным. Хз как собран QtSqlite.

В целом лучше из одного потока работать с sqlite.

RazrFalcon ★★★★★
()
Ответ на: комментарий от RazrFalcon

спасибо, пойду простым путем воспользуюсь таймером

Silerus ★★★★
() автор топика
Ответ на: комментарий от RazrFalcon

Однопоточным является объект «открытое соединение к базе». При этом sqlite позволяет открыть несколько соединений к одной базе, в том числе из разных процессов.

Модель «одновременные чтение из многих, запись из одного» довольно хорошо поддерживается в WAL-режиме.

Но даже в этом случае не поддерживаются параллельные транзакции записи - одна из них вернёт https://sqlite.org/rescode.html#busy

Приблизительно дело в том что в наборе системных примитивов на которые опирается sqlite нету «void дождаться_освобождения_блокировки_другим_процессом_и_захватить_её()», а есть только «bool захватить_блокировку_если_ещё_не_захвачено()»

Поэтому ожидания в sqlite почти никогда не происходит.

GPFault ★★
()
Ответ на: комментарий от GPFault

одновременные чтение из многих, запись из одного

Чтение - да. Но ТС хочет писать.

RazrFalcon ★★★★★
()
Ответ на: комментарий от GPFault

спасибо, то что я хотел знать. Буду бороться с возможным фризом при записи по другому. Что то я туплю сегодня, даже не догадался в этот раздел посмотреть

Silerus ★★★★
() автор топика

Если паралельно попытаться записывать то QSql выдаст SIGSEGV т.к. писать в sqlite можно только в одном потоке. Решается общим мьютексом на все потоки.

uralbash
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.