У меня проблема с синхронизацией в sqlalchemy:
Я использую postgresql для БД.
Вот что происходит:
- Запуск приложения с колбой питона.
- Создание заданного долговременного API конечной точки.
В API делаем следующее:
from multiprocessing import Process
def commit_unsaved_configuration():
create_process = Process(target=start_all_group_services, args=())
create_process.start()
process_id = create_process.pid
message_response = "Request Accepted at /api/v1/configuration/pending/{}".format(process_id)
return message_response, 202
Это реализация длинного API, которой я следую. В процессе, запущенном потоком, start_all_group_services
я фиксирую все данные в базе данных, используя db_session.commit()
.
В этом сеансе я создаю отдельный модуль Python и импортирую его следующим образом:
from db.config_db import db_session
.
Теперь дочерний процесс фиксирует изменения в БД. Это отлично работает. Теперь, когда я пытаюсь вставить новую запись в БД, я получаю следующую ошибку:
sqlalchemy.exc.InternalError: (psycopg2.InternalError) SAVEPOINT can only be used in transaction blocks
[SQL: 'SAVEPOINT sa_savepoint_2'] (Background on this error at: http://sqlalche.me/e/2j85)
2018-09-12 21:20:35,110 - api_server.controllers.override - ERROR - InternalError: (psycopg2.InternalError) SAVEPOINT can only be used in transaction blocks
[SQL: 'SAVEPOINT sa_savepoint_2'] (Background on this error at: http://sqlalche.me/e/2j85)
Таким образом, чтобы укорачивать вопрос, блок транзакции BEGIN, запущенный родительским процессом, не завершается, потому что фиксация выполняется в дочернем процессе, но родительский процесс не знает об этом.
Так что мне нужен способ сообщить родителю о коммите. Потому что, если я делаю коммит в родительском процессе, я не получаю ошибку.
Но мне нужно, чтобы коммит шел в дочернем процессе из-за потребностей API.