Вставить запись с автоматически сгенерированным идентификатором в несколько связанных таблиц в асинхронной среде с помощью Sqlite?

avatar
Rotareti
8 апреля 2018 в 09:09
28
1
2

У меня есть две таблицы, связанные друг с другом (упрощенный пример):

people

id |  person
------------
1  | Peter
2  | Emma
3  | Sarah

parents

id_person | id_parent
---------------------
3         | 1
3         | 2

Как видите, Sarah является дочерью Peter и Emma.

Теперь, как я могу добавить Sarah's брата Joe в обе таблицы, если ids в people автоматически увеличиваются и запросы выполняются в асинхронной среде?

Причина, по которой я упомянул "запросы выполняются в асинхронной среде", заключается в том, что я боюсь последовательного подхода, который выполняется в несколько шагов, таких как этот:

  • 1) - Вставить Joe в people
  • 2) - Чтение Joe's нового id из people
  • 3) - Вставить Joe's новый id в parents

может завершиться ошибкой, если другой запрос из другого потока/процесса/сопрограммы попадет в базу данных между 1) и 2).

Источник

Ответы (1)

avatar
Andomar
8 апреля 2018 в 09:19
1

После вставки Joe получить новый id с last_insert_rowid():

SELECT last_insert_rowid()

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

Rotareti
8 апреля 2018 в 09:28
0

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

Andomar
8 апреля 2018 в 09:39
0

Соединения обычно объединяются фреймворком, поэтому открытие одного не требует больших затрат. Обратите внимание, что если два потока используют одно и то же соединение одновременно, вы получите повреждение данных, база данных не предназначена для этого.