django .db.utils.OperationalError: не удалось сериализовать доступ из-за зависимостей чтения / записи - PullRequest
0 голосов
/ 10 января 2020

Я столкнулся с проблемой в последнее время. У меня есть конечная точка API, которая создает объекты в натуральном выражении. Непосредственно перед возвратом HTTPResponse он запускает поток, который вызывает другую конечную точку (в том же приложении), которая принимает объекты, созданные массово (в первую очередь), и выполняет некоторые операции с этими объектами. Например: обновление этих задач с некоторыми дополнительными параметрами и публикация этих задач в очереди сообщений.

Например: если я создал 10 объектов задач, конечная точка затем возьмет эти 10 задач, обновит их и опубликует sh их соответственно в последовательности, в которой они созданы.

thread = Thread(target=publish_bulk_tasks, args=(tasks_list,token,host))
thread.start()

Это функция, которая публикует задачи:

import requests
import json
def publish_bulk_tasks(tasks_list, token, host):
    data = {"tasks": tasks_list}
    response = requests.post(host + '/api/v1/tasks/send_bulk_tasks/',
                             data=json.dumps(data, indent=4, sort_keys=True, default=str, ).replace(
                                 '\\"',
                                 "\""),
                             headers={'Content-Type': 'application/json',
                                      'Authorization': token}).json()

Это ошибка, которую я получаю:

psycopg2.errors.SerializationFailure: could not serialize access due to read/write dependencies among transactions
DETAIL:  Reason code: Canceled on identification as a pivot, during write.
HINT:  The transaction might succeed if retried.


The above exception was the direct cause of the following exception:

    Traceback (most recent call last):
      File "C:\test_project\api\tasks\thread_handler.py", line 29, in run
        self.ret = self._target(*self._args, **self._kwargs)
      File "C:\test_project\api\tasks\task.py", line 680, in watch_task
        vm=None)
      File "C:\test_project\api\tasks\utils.py", line 218, in update_task
        task_obj.save()

Теперь фрагмент кода, который является причиной этой ошибки:

task_obj.ad_domain_name = domain

try:
    vm = VMDetails.objects.get(id=vm)
    task_obj.vm = vm
except:
    pass

    task_obj.save()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...