Sqlalchemy同步子进程和父进程的提交

时间:2018-09-12 15:58:35

标签: python postgresql sqlalchemy flask-sqlalchemy python-multiprocessing

我在sqlalchemy中有一个同步问题: 我正在使用Postgresql for DB。

这是发生了什么事

  1. 运行python flask应用程序。
  2. 使给定的端点长时间运行的API。
  3. 在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的需要,提交应该在子进程中进行。

0 个答案:

没有答案