Могут ли разные соединения одной и той же базы данных sqlite начинать транзакции одновременно?

Я столкнулся со странной проблемой, связанной с sqlite3. Я получил разные соединения одного и того же файла базы данных, используя метод open(). соединение 1 начинает транзакцию, а соединение 2 начинает другую транзакцию, которая должна обновить несколько записей таблицы. Затем соединение 1 фиксирует транзакцию, а затем соединение 2 фиксирует свою транзакцию. Но я обнаружил, что команда обновления соединения 2 никогда не обновляет запись в базе данных. Во время этой процедуры исключений не возникает. Я не знаю, почему возникает проблема. Может ли кто-нибудь объяснить мне причину?


person user26404    schedule 18.12.2008    source источник


Ответы (2)


Если вы прочтете документацию по SQLite, вы увидите, что она поддерживает несколько подключений только для чтения, вы не можете записывать в базу данных из нескольких подключений, потому что она не предназначена для этого.

http://www.sqlite.org/faq.html#q5

person rustyshelf    schedule 18.12.2008
comment
Однако вы можете иметь две одновременные транзакции записи, что и вызывает проблему. - person Doug Currie; 18.12.2008
comment
Итак, если есть транзакция, которая выполняет операцию записи в базу данных, любые другие операции записи не могут изменить базу данных, независимо от того, находятся ли эти операции в транзакции или нет? - person user26404; 18.12.2008
comment
Могу ли я выполнить операцию выбора, когда есть другое соединение, выполняющее операцию записи (вставка, обновление) в то же время? - person user26404; 18.12.2008
comment
Транзакции не изменяют базу данных (насколько это могут сказать другие транзакции) до момента COMMIT. Таким образом, несколько транзакций могут одновременно выполнять операции записи, но только одна из них будет успешной в COMMIT. Все операции находятся в транзакции; это может быть неявно. - person Doug Currie; 18.12.2008
comment
Вы можете выполнять операции SELECT в базе данных, пока другая транзакция выполняет операции записи. SELECT не увидит записи (если только вы не используете общий кэш в режиме чтения-незафиксированного; см. sqlite. org/sharedcache.html). - person Doug Currie; 18.12.2008

Если вы не используете BEGIN IMMEDIATE для инициирования транзакций, вы рискуете откатиться и повторить их. A BEGIN не блокирует; последующее UPDATE или INSERT получает блокировку, и вам нужно проверить код результата, чтобы увидеть, не сработают ли они. См. эту страницу на транзакциях и эту на замки.

person Doug Currie    schedule 18.12.2008